斑竹请进:关于模板有多页,循环生成多条记录到一个word文件中代码

lonaerd 2010-12-24 10:09:36
原帖:http://topic.csdn.net/u/20101220/21/fda21ce0-5dec-4eec-aae2-3b52714c4c84.html
(望斑竹把上面的200分还给我)

我自己来贴个答案吧,这里实在太冷清,我都2年没用DELPHI了,现在偶尔用一下遇到问题,本想偷懒,看来还是自力更生,希望斑竹把这个分还给我。同时,网上类似例子也没有,但愿以下代码对后人有用:

procedure TPrintWord.PrintWords(sqlstr:string);
var
templateName: OleVariant;
newTemplate: OleVariant;
ItemIndex: OleVariant;
vSelection: wordSelection;
vBookMark: BookMark;
vTable: Table;
CopyTable:Table;
I : Integer;
j:integer;
rend:OleVariant;
myrange:range;
rs:tadoquery;
begin

CallFormCreate;
//构造打印模板文件名全路径
templateName := folderName + 'cld4.dot';
newTemplate := False;

try
wordApp.Connect();
except
MessageDlg('您的计算机上还未安装Microsoft Office Word97或更高的版本!', mtError, [mbOK], 0);
Abort;
end;

//以指定的模板文件创建新Word文档
wordApp.Documents.AddOld(templateName, newTemplate);
vSelection := wordApp.Selection;
rs:=connect.opentable(sqlstr);
j:=1;
ItemIndex:=1;
WordDocument1.ConnectTo(WordApp.Documents.Item(ItemIndex));
// 先拷贝整个文档模板
WordApp.ActiveDocument.Select ;
WordApp.Selection.Copy;


while not rs.eof do
begin
frm_wait.ProgressBar1.StepBy(j);
//取文档中的第1张表
vTable := wordApp.ActiveDocument.Tables.Item((j-1)*11+1);
vTable.Cell(1, 2).Range.Text := rs.FieldByName('st_name').Text;
vTable.Cell(2, 2).Range.Text := rs.FieldByName('class_name').Text;
////取文档中的第2张表
vTable := wordApp.ActiveDocument.Tables.Item((j-1)*11+2);
vTable.Cell(1, 1).Range.Text := datetostr(date);


if j<rs.RecordCount then
begin //将光标置于末端,然后粘贴
worddocument1.Range.InsertAfter(''+#13);
rend:=worddocument1.Range.End_-1;
myrange:=WordDocument1.Range(rend,rend);
myrange.Paste;
end;
rs.Next;
inc(j);
end;
wordApp.Visible := true;
wordApp.WindowState := 1;
//打印预览
//wordApp.PrintPreview := CheckBox2.Checked;

//立即打印
// if CheckBox3.Checked then
// wordApp.PrintOutOld;

wordApp.Disconnect();
frm_wait.Close;
end;
procedure TPrintWord.CallFormCreate();
var
templateName: String;
fileStream: TResourceStream;
begin
//获得应用程序所在的目录
folderName := ExtractFilePath(Application.ExeName);

if not FileExists(folderName+'template.res') then
begin
MessageDlg('错误:找不到模板资源文件template.res!', mtError, [mbOK], 0);
exit;
end;

//构造WORD打印模板的文件名全路径
templateName := folderName + 'cld4.dot';
//获得资源文件里的“处理单”打印模板
fileStream := TResourceStream.Create(hInstance, 'cld4', 'WORD');

if not FileExists(templateName) then
begin
//拆离文件
fileStream.SaveToFile(templateName);
//释放
fileStream.Free;
end;

end;
...全文
156 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cailufei 2012-12-21
  • 打赏
  • 举报
回复
解决了,呵呵,不过非常感激兄台的指点!否则完不成这个东西!
cailufei 2012-12-21
  • 打赏
  • 举报
回复
能够实现多模板,但是碰到了一个问题,会产生多余的空白页?
系统名称:国福布斯名人网 关于国福布斯名人网(www.cnforbes.com)管理系统的功能说明 本系统为ASP+ACCESS的数据库系统,采用经典版本的动力内核,生成网页速度快,无用代码少,界面自定义性强,本下载内容提供一个通用INDEX.ASP扩展,用户可根据自已的美工要求进行美化, 一个默认的INDEX.HTM 1、系统前后台实现完全分离,前台页面需要自己设计并插入相关的JS代码即可,真正实现个性化; 2、系统自动生成HTM静态页面,实现95%以上的浏览量为纯静态访问,与数据库无关,极大降低所消耗的系统资源,可以承载门户级的访问量; 3、实现无限一级分类和无限二级分类,可以对每个分类进行单独的修改、删除 4、在每个一级分类可以建立新闻专题,对专题可以进行修改、删除管理,并可控制是否在前台显示 5、发表文章采用功能强大的在线编辑器,实现所见即所得的录入功能 6、发表文章分快速录入和版面录入,快速录入需要选择一、二级分类,版面录入则无须选择,使得录入更便捷 7、管理用户采用四级分类:系统管理员拥有所有权限;管理员具有管理某一大类权限,斑竹具有管理某二级分类权限,录入员只有录入权限 8、所有管理用户可以在线修改自己的资料、密码;同时所有密码均采用加密处理,使得系统更安全 9、管理用户可以在后台进行留言交流,并可以查看等级小于自己的管理用户的资料 10、文章模版可以设置多套,同时可以对模版增加、修改、删除、是否生效进行设置 11、可以在线增加、修改、删除文章来源 12、可以对前台调用的JS代码进行自定义,包括新闻条数、标题前修饰代码、标题后是否显示时间 13、可以在后台查看任何一个JS代码信息,极大方便前台设计与调用 14、可以在后台进行数据库的备份、恢复,并可以执行SQL语句;可以查看服务器的变量 15、后台可以方便查看用户文章数、总类文章数、版面文章数、专题文章数等统计数据 16、后台发表文章后需要审核、生成代码后才能显示在前台 17、相关新闻的显示功能 18、每天第一次登陆后台同时创建当天的文件目录 19、批量删除(点击字类列表左边最上方的图标) 20、首页图片新闻条数、宽度、高度;图片新闻增加、修改、删除、审核 21、子类文章的模版转换 官方网站http://www.cnforbes.com 网站显示界面http://www.cnforbes.com 网站下载地址:http://www.cnforbes.com/news.rar 网站登录帐号密码:admin admin 地址:http://域名/news/login.asp 程序大小:3.3M

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧