转自 http://xxzqb.blog.163.com/blog/static/4122142920089249514506/
开发原因:公司财务要每月与专卖店对帐,其对帐单格式是统一的,只是每月改变其中的数据。
如下图:
所以,我设置了一个模板,名字为 xldzd.dot ,格式如下:
即把每月要修改的数据做成批注。
然后在 d:\对帐单 目录下创建 每月的目录,其名称为日期,如: d:\对帐单\2008-10 。(这部分是由程序产生)
然后,查询数据表(adoquery),
在刚才建立的目录下,产生word文档,上面查询出的数据依次替换 批注,完毕后,删除批注,并且关闭该word文档,然后继续替换,每一个专卖店产生一个word文档,其名称为专卖店的email 。 在电脑中的结果如下图:
程序的关键语句在 procedure TForm9.Button3Click(Sender: TObject);
unit Unit9;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, DBXpress, SqlExpr, DBTables,
WordXP, OleServer, ComCtrls;
type
TForm9 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
WordDocument1: TWordDocument;
WordApplication1: TWordApplication;
OpenDialog1: TOpenDialog;
Button3: TButton;
StatusBar1: TStatusBar;
ADOConnection2: TADOConnection;
ADOQuery2: TADOQuery;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure deletecomment();
procedure writecomment(explans:array of string);
procedure wordini(template:olevariant);
procedure setopendialog;
procedure substpostils(postils:array of string);
procedure deletepostils;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form9: TForm9;
ptotal:integer;
implementation
uses Unit10;
{$R *.dfm}
procedure TForm9.deletecomment;
var
total:integer;
begin
total:=worddocument1.Comments.Count;
while total<>0 do
begin
worddocument1.comments.item(total).Delete;
total:=worddocument1.comments.Count;
end;
end;
procedure TForm9.wordini(template: olevariant);
var
newtemplate,itemindex:olevariant;
begin
newtemplate:=false;
itemindex:=1;
try
wordapplication1.Connect;
except
wordapplication1.Disconnect;
messagedlg('请安装Office中的Word软件!',mterror,[mbok],0);
exit;
end;
wordapplication1.Visible:=true;
wordapplication1.Documents.Add(template,newtemplate,emptyparam,emptyparam);
worddocument1.ConnectTo(wordapplication1.Documents.Item(itemindex));
ptotal:=worddocument1.Comments.count;
end;
procedure TForm9.writecomment(explans: array of string);
var
i,total:integer;
begin
total:=worddocument1.Comments.Count;
for i:=0 to total do
worddocument1.Comments.item(i).Scope.Text:=explans[i-1]
end;
procedure TForm9.setopendialog;
var
pathname,filename:string;
begin
//保证选择的文件必须存在
opendialog1.Options:=[offilemustexist];
opendialog1.filter:='word files(*.dot)|*.dot|all files(*.*)|*.*';
//设置*.dot类型为缺省类型
opendialog1.FilterIndex:=1;
//设置文档模板文件名为缺省值
opendialog1.FileName:='xldzd.dot';
if not opendialog1.Execute then
exit;
pathname:=extractfilepath(opendialog1.FileName);
filename:=extractfilename(opendialog1.FileName);
if lowercase(copy(filename,length(filename)-4+1,4))<>'.dot' then
begin
messagedlg('请打开Word模板文件!',mterror,[mbok],0);
exit;
end;
if lowercase(filename)<>'xldzd.dot' then
begin
messagedlg('请选择正确的Word模板文件!',mterror,[mbok],0);
exit;
end;
end;
procedure TForm9.substpostils(postils: array of string);
var
i:integer;
begin
//逐个替换批注
for i:=1 to ptotal do
begin
worddocument1.Comments.Item(i).Scope.Text:=postils[i-1];
end;
end;
procedure TForm9.deletepostils;
var
total:integer;
begin
total:=ptotal;
while total<>0 do
begin
//删除文档中的一个批注
worddocument1.comments.Item(total).Delete;
//获得文档中的剩余批注总数
total:=worddocument1.Comments.Count;
end;
end;
procedure TForm9.Button1Click(Sender: TObject);
begin
//查询富友中的数据(太慢)
with adoquery2 do
begin
close;
sql.clear;
sql.add('select kcckdm,sum(kcqcje),sum(kcrkje),sum(kcckje) from kct06');
sql.add('where kckjnd=2008 and kckjyf=8');
sql.Add('group by kcckdm');
sql.add('order by kcckdm');
open;
//下面代码没问题
{close;
sql.clear;
sql.add('select * from ylm03');
open; }
end;
end;
procedure TForm9.Button3Click(Sender: TObject);
var
postils:array of string;
//y,m,d:word;
pathname,filename:string;
savedocfile,emptypara:olevariant;
//这些都是目录名称
dir:string;
currdir:string;
dirname:string;
curr_dir:string;
begin
//先建立文件夹 (放在d:\对帐单\下)
//先判断文件夹是否已存在 , 不存在,就创建之
if not directoryexists('d:\对帐单') then
begin
try
//创建文件夹
mkdir('d:\对帐单');
statusbar1.Panels[2].Text:=' ① d:\对帐单 目录创建成功!';
except
statusbar1.Panels[2].Text:=' ③ d:\对帐单 目录无法创建!';;
exit;
end;
end else
begin
statusbar1.Panels[2].Text:=' ② d:\对帐单 目录已经存在!';
end;
//把日期当前日期当作新建文件夹的名称
dir:=formatdatetime('yyyy-mm',date);
try
//改变当前文件夹为 d:\对帐单
chdir('d:\对帐单');
//取得当前文件夹,赋值给变量 currdir
getdir(0,currdir);
statusbar1.Panels[2].Text:=' ④ 当前目录为:'+currdir;
except
end;
//在文件夹 d:\对帐单 下根据日期创建文件夹,文件夹名为日期
if not directoryexists('d:\对帐单\'+dir) then
begin
try
//创建文件夹
mkdir('d:\对帐单\'+dir);
statusbar1.Panels[2].Text:=' ⑤ d:\对帐单\'+dir+' 目录创建成功!';
except
statusbar1.Panels[2].Text:=' ⑥ d:\对帐单\'+dir+' 目录无法创建!';;
exit;
end;
end else
begin
statusbar1.Panels[2].Text:=' ⑦ d:\对帐单\'+dir+' 目录已经存在!';
//exit;
end;
//转换当前文件夹至 d:\对帐单\日期
try
//改变当前文件夹为 d:\对帐单\日期
chdir('d:\对帐单\'+dir);
//取得当前文件夹,赋值给变量 curr_dir
getdir(0,curr_dir);
statusbar1.Panels[2].Text:=' ⑧ 当前目录为:'+curr_dir;
except
end;
//------------------------------------------------------------
//setopendialog;
//保证选择的文件必须存在
opendialog1.Options:=[offilemustexist];
opendialog1.filter:='Word Files(*.dot)|*.dot|All Files(*.*)|*.*';
//设置*.dot类型为缺省类型
opendialog1.FilterIndex:=1;
//设置文档模板文件名为缺省值
opendialog1.FileName:='xldzd.dot';
//如果打开对话框没有运行,就退出
if not opendialog1.Execute then
exit;
//赋文件名
pathname:=extractfilepath(opendialog1.FileName);
filename:=extractfilename(opendialog1.FileName);
if lowercase(copy(filename,length(filename)-4+1,4))<>'.dot' then
begin
messagedlg('请打开Word模板文件!',mterror,[mbok],0);
exit;
end;
if lowercase(filename)<>'xldzd.dot' then
begin
messagedlg('请选择正确的Word模板文件!',mterror,[mbok],0);
exit;
end;
//查询出要插入的数据表数据
with adoquery1 do
begin
close;
sql.clear;
sql.add('select * from xldzd');
open;
first;
//赋值给批注
while not adoquery1.Eof do
begin
wordini(pathname+filename);
setlength(postils,ptotal);
postils[0]:=trim(fieldbyname('t1').asstring);
postils[1]:=trim(fieldbyname('t2').asstring);
postils[2]:=trim(fieldbyname('t3').asstring);
postils[3]:=trim(fieldbyname('t4').asstring);
postils[4]:=trim(fieldbyname('a1').asstring);
postils[5]:=trim(fieldbyname('a2').asstring);
postils[6]:=trim(fieldbyname('a3').asstring);
postils[7]:=trim(fieldbyname('a4').asstring);
postils[8]:=trim(fieldbyname('a5').asstring);
postils[9]:=trim(fieldbyname('b1').asstring);
postils[10]:=trim(fieldbyname('b2').asstring);
postils[11]:=trim(fieldbyname('b3').asstring);
postils[12]:=trim(fieldbyname('b4').asstring);
postils[13]:=trim(fieldbyname('b5').asstring);
//填充批注
substpostils(postils);
//删除批注
deletepostils;
//保存目录及文件 ,文件名为 email.doc
savedocfile:=curr_dir+'\'+fieldbyname('email').asstring+'.doc';
emptypara:=emptyparam;
//保存文档
worddocument1.SaveAs(savedocfile,emptypara);
//关闭该文档
worddocument1.Close;
next;
end;
end;
statusbar1.Panels[3].Text:=' 对帐单已全部保存完毕!';
//最后关闭word
wordapplication1.Disconnect;
end;
end.