新手求教关于程序录入界面生成word文档并打印的问题,急,谢谢! ( 积分: 150 )

  • 主题发起人 主题发起人 spirit_day
  • 开始时间 开始时间
S

spirit_day

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟delphi新手,现做一个系统,在录入数据的时候,要求能够把录入界面生成对应的word文档并打印,录入的类型有文本、图片、memo等。
搜索了相关的内容,发现资料比较多,但是有详细的源码较少。好象有两种解决方式,一种是通过做好的word模板往里边对应项填充数据,另一种是自己画word。

我只有200分,现给150,还有50分问个其他问题,还请各位高手指教一下(最好能给稍微详细点的代码,非常感谢!)。
 
自己upup
为什么没有人看我的帖子啊~
这么早就发贴了,难道就因为我是新手没有人愿意回答吗?
 
如果格式固定,通过模版填充数据是一个不错的方法。
填充数据时可以采用标签或表格的方式进行。
如果采用标签的方式,先在模版中定义好标签,然后在VBA中给标签赋值即可。
如果采用表格方式,就要在VBA中填充表格了。
下面的一段代码,你可以参考一下:
标签方式(VBA代码):
With ActiveDocument
.Bookmarks("sjmc").Range.Text = sjmc
.Bookmarks("dysjr").Range.Text = FirstDesigner
.Bookmarks("sjrq").Range.Text = designdate_in
.Bookmarks("desjr").Range.Text = SecondDesigner
End With
表格方式(VBA代码):
Procedure TEditLdNewForm.SetLdValue;
var
myJsy,myCph,myYcDw,mydwmc1,myLdBh,myksrq,myJsrq,myZbdd,myBdsj,myBddd,myCcRw,myCx,myBz,myYcdw1:string;
CurYear,CurMonth,curDay:word;
mycph_1,mystr:string;
I,iIndex,iPos:Integer;
pAdo:Tadoquery;
myForm:TForm;
V:Variant;
Template,NewTemplate,DocumentType,Visible:OleVariant;
itemIndex:OleVariant;
fileName:Olevariant;
NoPrompt,OriginalFormat:OleVariant;
RouteDocument,SaveChanges:OleVariant;
vSelection: Selection;
vBookMark: BookMark;
vTable,VTable1,vTable2,vTable3,vtable4,vtable5: Table;
begin
try
if Varisnull(adoquery1.fieldvalues['司机'])=False Then myJsy:=trim(adoquery1.fieldvalues['司机'])
Else myJsy:='';
if Varisnull(adoquery1.fieldvalues['车牌号'])=False Then myCph:=trim(adoquery1.fieldvalues['车牌号'])
Else myCph:='';
if Varisnull(adoquery1.fieldvalues['用车单位'])=False Then myYcdw:=trim(adoquery1.fieldvalues['用车单位'])
Else myYcdw:='';
mydwmc1:=readdatastr('select dw as myfieldname from yhdwwhtable where dwdm='''+myycdw+'''');
myycdw:=mydwmc1;
if Varisnull(adoquery1.fieldvalues['备注'])=False Then mybz:=trim(adoquery1.fieldvalues['备注'])
Else mybz:='';
If Varisnull(adoquery1.fieldvalues['路单编号'])=False Then myLdbh:=adoquery1.fieldvalues['路单编号']
else myLdbh:='00000000';
if Varisnull(adoquery1.fieldvalues['报到地点'])=False Then myBddd:=trim(adoquery1.fieldvalues['报到地点'])
Else myBddd:='';
if Varisnull(adoquery1.fieldvalues['出车任务'])=False Then myccRw:=trim(adoquery1.fieldvalues['出车任务'])
Else myccRw:='';
If VarIsnull(adoquery1.fieldvalues['出车日期'])=False Then myKsRq:=DatetimeToStr(adoquery1.fieldvalues['出车日期'])
else myKsRq:='';
If VarIsnull(adoquery1.fieldvalues['返回日期'])=False Then myJsRq:=DatetimeToStr(adoquery1.fieldvalues['返回日期'])
else myjsRq:='';
If Length(trim(myCph))>0 Then myCx:=ReadDataStr('select cx as myFieldName from clwhtable where ch='''+mycph+'''')
Else myCx:='';
if Varisnull(adoquery1.fieldvalues['值班调度'])=False Then myzbdd:=trim(adoquery1.fieldvalues['值班调度'])
Else myzbdd:='';
if Varisnull(adoquery1.fieldvalues['报到时间'])=False Then myBdsj:=trim(adoquery1.fieldvalues['报到时间'])
Else myBdsj:='';
decodedate(Now,CurYear,CurMonth,CurDay);
wordApp.Connect();
wordApp.Visible:=true;
//template:=extractfilepath(application.ExeName)+'ld.dot';
template:=extractfilepath(application.exename)+'aebh.dot';
filename:='c:/temp001.doc';
NewTemplate:=False;
DocumentType:=wdNewBlankDocument;
Visible:=true;
WordApp.Documents.Add(Template,NewTemplate,DocumentType,Visible);
//连接到新建的文档
itemIndex:=1;
WordDoc.ConnectTo(WordApp.Documents.Item(itemIndex));
vSelection := wordApp.Selection;
vTable := wordApp.ActiveDocument.Tables.Item(1);
vTable1 := wordApp.ActiveDocument.Tables.Item(2);
vTable2 := wordApp.ActiveDocument.Tables.Item(3);
vTable3 := wordApp.ActiveDocument.Tables.Item(4);
vTable4 := wordApp.ActiveDocument.Tables.Item(5);
vTable5 := wordApp.ActiveDocument.Tables.Item(6);
vTable.cell(1,1).Range.Text:='NO.'+myldbh;

vTable2.cell(2,1).Range.Text:='NO.'+myldbh;
vTable1.cell(2,1).Range.Text:=inttostr(curyear)+'年'+Inttostr(curmonth)+'月'+inttostr(curDay)+'日'+TimetoStr(Time);
vTable3.cell(1,2).Range.Text:=mycx;
vTable3.cell(1,4).Range.Text:=mycph;
vTable3.cell(1,6).Range.Text:=myjsy;
vTable3.cell(1,8).Range.Text:=mybdsj;
vTable3.cell(3,1).Range.Text:=myycdw;
vTable3.cell(3,2).Range.Text:=myksrq;
vTable3.cell(3,3).Range.Text:=myjsrq;
vTable3.cell(3,4).Range.Text:=mybddd;
vTable3.cell(3,5).Range.Text:=myccrw;
vtable4.cell(1,2).range.text:=mycph;
vtable4.cell(2,2).range.text:=myjsy;
vtable4.cell(3,2).range.text:=myksrq;
vtable4.cell(4,2).range.text:=myjsrq;
vtable4.cell(5,2).range.text:=myccrw;
vtable4.cell(6,2).range.text:=myycdw;
vtable4.cell(7,2).range.text:=myzbdd;
vtable4.cell(8,2).range.text:=mybz;
vTable5.cell(1,1).Range.Text:=inttostr(curyear)+'年'+Inttostr(curmonth)+'月'+inttostr(curDay)+'日'+TimetoStr(Time);
vtable5.cell(1,3).range.text:='';
vtable5.cell(1,5).range.text:='';
vtable5.cell(1,7).range.text:=myzbdd;
//文档另存为
WordDoc.SaveAs(filename);

//worddoc.PageSetup.PaperSize:=wdCustom;
//worddoc.PageSetup.PageWidth:=267;
//worddoc.PageSetup.PageHeight:=127;
If kPrintID=0 Then
wordApp.PrintPreview; //打印预览
If kPrintID=1 Then

wordapp.PrintOutOld; //直接打印输出
//worddoc.Disconnect; //断开文档
worddoc.Close; //关闭文档
wordapp.Quit; //退出
wordApp.Disconnect; //断开连接
except
end;
end;

关于在word中写入图片的VBA代码:
ActiveDocument.Tables(1).Cell(5, 3).Range.InlineShapes.AddPicture FileName:=path, LinkToFile:=False, SaveWithDocument:=True
 
我的格式是固定的,想采用模板的方式,非常感谢谢谢楼上的回答,很详细,我先测试一下,期待更多高手的指点!
还有一个问题就是我发现加入图片的代码都是指定图片路径的,如果我的图片是从数据库读取的流式数据显示的,该怎样加入呢?
 
图片的问题解决方法:可以先把数据库中的图片写到一个指定的文件,然后再插入
 
这个我也想到了,非常wzquan同学的回答!
 
帮你顶,接个小分
 
谢谢各位,我现在还没有时间来实践这个问题,新的问题却又来了,伤心!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部