用WORD做DELPHI报表输出工具
Delphi7报表制作入门

Delphi报表制作入门Delphi 7.0 中实现报表的方法称为 Rave。
Rave 报表是一种基于组件的可视化报表设计工具,使用它可以简化设计过程,提高设计效率。
只要将 Rave 报表组件添加到应用程序中后,就可以创建各种类型的报表。
本文将以 ADO 组件连接数据库,向读者介绍怎样利用 Rave Report5.0 快速设计报表。
还是赶快行动起来,体验一下 Rave Reports 的强大功能吧!1.准备好范例数据库,笔者使用 Access 建立数据库Student.mdb,创建一个表:StuInf(学生基本信息),包含Sno(学号),Sname(姓名),Sex(性别),Class(班级),Birthday(出生日期)... 等字段,所有字段名先使用括号中的中文;再写入几条数据备用。
2.启动Delphi7.0 建立一个工程,在窗体上放置一个ADOQuery 控件,设置其ConnectionString 属性,连接数据库 Student,设置 SQL 属性为“select * from StuInf;”,Active 属性为 True 。
为了能看到库中的数据,再往窗体上放置一个DBGrid 和一个 DataSource ,设置相关属性,使 DBGrid 中显示数据。
3.在窗体上添加一个 GroupBox,设置其 Caption 为“选择报表式样”;往其中添加两个 RadioButton ,Caption 分别为“条列形式”、“表格形式”;往窗体上添加一个按钮,Caption 为“显示报表”。
现在,准备工作已经完成了,保存工程,下面开始报表的设计。
4.在窗体上添加一个RvDataSetConnection组件,设置其DataSet为ADOQuery1,这样,就提供了 Rave 报表与数据源之间的连接。
5.在 Delphi 主菜单的 Tools 中选择 RaveDesigner 启动 Rave Reports5.0。
利用Delphi中Servers组件结合Word模板实现某些特殊功能的打印需求(一)

利用Delphi中Servers组件结合Word模板实现某些特殊
功能的打印需求(一)
胡清钟;李纳璺
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2003(000)005
【摘要】一、引言在实际工作中,用户常常会提出某些特殊打印需求,比如各种证件、证明文件以及带有统计功能的数据库报表等等。
本篇我将介绍这类报表之一——证明文件的制作过程,如图1所示。
它具有如下一些特点: 1.文档数据特点。
文档中大部分字符是固定不变的,只
【总页数】4页(P28-31)
【作者】胡清钟;李纳璺
【作者单位】
【正文语种】中文
【中图分类】TP3
【相关文献】
1.利用Word自动化服务器实现基于模板的文书打印 [J], 胡明晓
2.利用Dephi中Servers组件结合Word模板实现某些特殊打印报表需求(二) [J], 胡清钟;李纳璺
3.利用Delphi7与XML开发Web通用打印ActiveX组件 [J], 闫朝阳;余飞飞
4.一种Word和Excel结合制作打印模板实现批量套打的方法 [J], 林慕婵
5.利用Access和VBA编程实现医保变更业务中Word表格模板的批量打印 [J], 闫婷婷
因版权原因,仅展示原文概要,查看原文内容请购买。
DELPHI报表的动态生成

DELPHI报表的动态生成(Create Delphi Dynamic Report)摘要:本文主要介绍如何在DELPHI开发环境下动态生成报表,给出公用模块,并结合具体示例分析了实现的主要技术问题,给出解决这些问题的技术细节。
关键词:DELPHI报表、动态创建一、引言报表是数据库应用程序的重要部分,可是报表的生成也是数据库开发中最麻烦的一项工作。
报表格式复杂多样,一直是使程序员头疼的事。
DELPHI 在其3.0以后版本中加入了QUICKREPORT,使这种情形有所改变。
它的全部可视化编程以及设计和运行过程中都可以进行预览等特性给程序开发带来了很大的方便。
我们可以通过在应用程序设计阶段往窗体中添加报表控件,再与数据库表组件Ttable,查询组件Tquery等数据访问组件相关联,从而实现报表的预览与报表的输出。
但在许多应用程序中,程序员往往期望从静态或者动态生成的数据库表中动态提取所需数据,进而生成报表输出。
本文介绍的就是如何动态选择所需数据,动态生成报表的公用模块。
这种动态方式生成的报表更加灵活,也更加容易做到报表的格式统一。
动态报表主要是在程序运行阶段利用Creat方法动态创建控件,设置其Parent属性来设置其容器控件。
然后,在程序中根据所选择的数据库表中的数据字段的长度和数目,通过修改控件的大小和位置属性,来控制控件的大小和外观,如果该控件有事件,可直接把函数或过程名赋给它的相应事件名。
二、动态报表的实现下面结合一个具体实例来说明如何其实现的方法和技术。
1、基本思路数据来源,我们以DELPHI自带的DBDEMOS中的employee.db表为例,它共有6个字段。
在F_main主窗体中(如图一),可以自由选择所需要打印的字段。
它的主要控件及属性设置如下:①.Table1:Databasename设置为DEDEMOS,Tablename设置为employee.db②.Listbox1:显示所连数据库表中的全部字段③.Listbox2:用于选择所需报表输出的字段④.AddBitBtn:用于把所选择的字段名添加到Listbox2中⑤.DeleteBitBtn:用于把Listbox2中的字段名去掉⑥.PreviewBitBtn:用于报表的预览⑦.PrintBitBtn:用于报表的输出⑧.CloseBitBtn:用于关闭应用程序在F_report窗体中,放置了以下主要控件,并设置属性,以减少程序的篇幅:①.Table1:Databasename设置为DEDEMOS,Tablename设置为employee.db②.QuickRep1:papesize属性为A4,dataset属性为Table1,bands 属性中的hascolumnheader、hasdetail、hastitle设置为True显示数据库表中的全部字段在F_report的Oncreate事件中加入了如下代码:Table1.Open;if Table1.Active thenTable1.GetFieldNames(Listbox1.Items);// 获得数据库表中的全部字段名DeleteBitBtn.Enabled:=False; //在Listbox2中无字段时,DeleteBitBtn变灰2、从Listbox1中选择字段添加到Listbox2中为AddBitBtn的Onclick事件加入如下代码:if listbox1.Items.Count=0 then exit; //如Listbox1中无可供选择的字段,则执行空操作if listbox1.Selected[listbox1.ItemIndex] then //在Listbox1中选择字段beginListbox2.Items.Add(Listbox1.Items[Listbox1.ItemIndex]);//往Listbox2中增加选中的字段Listbox1.Items.Delete(Listbox1.ItemIndex);//从Listbox1中删除此字段if Listbox2.Items.Count>=1 then //在Listbox2中有字段才允许执行删DeleteBitBtn.Enabled:=True;end;3、从Listbox2中删除不需要的字段为DeleteBitBtn的Oncreate事件添加如下代码:if Listbox2.Items.Count=0 then exit; // 如果Listbox2中无字段,则执行空操作if listbox2.Selected[Listbox2.ItemIndex] then //在Listbox2中选择字段beginListbox1.Items.Add(Listbox2.items[Listbox2.itemindex]); //添加到Listbox1中Listbox2.Items.Delete(Listbox2.itemindex); //从Listbox2中删除此字段end;if Listbox2.Items.Count=0 then //如果Listbox2中无字段,则DeleteBitBtn变灰DeleteBitBtn.Enabled:=False;4、在报表中动态添加一列的步骤:①.TitleBand1中打印的是报表的名称,这里假设为:动态报表生成示例。
Delphi利用excel生成报表

Delphi利用excel生成报表
凌辉
【期刊名称】《计算机光盘软件与应用》
【年(卷),期】2011(000)002
【摘要】Delphi控制Excel作为数据库信息系统的数据表或条件查询结果的输出,并自由控制输出报表,是Delphi报表最佳选择.
【总页数】1页(P5)
【作者】凌辉
【作者单位】地税局信息中心,江西九江,332000
【正文语种】中文
【中图分类】TP311.11
【相关文献】
1.Delphi编程实现Excel报表自动生成和发布 [J], 冷建功;赵健
2.在Delphi中如何选择字段动态生成Excel报表 [J], 刘迎春;吕翠萍
3.在Delphi编程中利用Excel实现动态报表 [J], 余永武
4.Delphi中利用Excel实现动态报表的生成 [J], 韦伟
5.Delphi控制Excel生成统计报表研究 [J], 张有华;张敬敏;秦彭
因版权原因,仅展示原文概要,查看原文内容请购买。
Delphi表格控件DBGridEh应用实例3-编辑功能

Delphi表格控件DBGridEh应⽤实例3-编辑功能3. 编辑功能1) 多选TDBGridEh 允许在选定的区域上进⾏选择记录,列以及矩形区域等操作:允许多选会影响下⾯这些属性:Options 选项中的dgMultiSelect 属性- 设置是否允许多选。
Options 选项中的dghClearSelection 属性- 设置在⽤户移到下⼀个单元时是否清除已选记录。
Options 选项中的EdITActions属性-设置⽤户可以在已选记录上执⾏哪些操作(⽐如,拷贝,剪切,删除,粘贴,全选等)。
Options 选项中的AllowedSelections 属性-设置允许选定记录的类型(⽐如,⾏,列,矩形区域等)。
Options 选项中的Selection 属性-设置⼀个当前的多选状态,已选记录,列或矩形区域以及存取它们的属性和函数。
2) ⽂本多⾏显⽰Column.WordWrap 为True可以使数据⾏中⽂本多⾏显⽰。
如果⾏⾼>⽂本⾏,它就换⾏。
3) 显⽰备注字段设置DrawMemoText to True来显⽰⽂本式的备注字段。
.4) 如何让dbgrideh1显⽰数据时只显⽰两位⼩数DBGrideh1.Columns[0].DisplayFormat := '#.#0';5) 获得当前DBGridEh表中单元格的序号DBGridEh1.SelectedIndex6) 怎样在dbgridEh和Edit中显⽰⾦额的千分号1、dbrigeh.columns[0].DisplayFormat := ,0.002、2、adoquery1.fields[0].DisplayFormat := #,##0.003、都可以4、在保存之前,记得把','号全部replace 掉,5、tmpEdit.Text := StringReplace(tmpEdit.Text, ',', '', [rfReplaceAll]);6、tmpEdit.Text := StringReplace(tmpEdit.Text, ',', '', [rfReplaceAll]);7、在out 时调⽤函数⾃动加千分号8、tmpEdit.Text := FloatFormat(tmpEdit.Text);9、输出整型的10、function TTblRecordEditFrame.IntFormat(intValue: string): string;11、begin12、//13、if intValue = '' then14、Result := ''15、else17、intValue := StringReplace(intValue, ',', '', [rfReplaceAll]);18、intValue := StringReplace(intValue, ',', '', [rfReplaceAll]);19、Result := formatfloat('#,###,##0', StrToFloat(intValue));20、end;21、end;22、//格式化浮点数,加千分号,删除后边的023、function TTblRecordEditFrame.FloatFormat(floatValue: string): string;24、var25、decPart, intPart: string;26、i, j: Integer;27、numFormat: string;28、begin29、//30、if floatValue = '' then31、Result := ''32、else33、begin34、floatValue := StringReplace(floatValue, ',', '', [rfReplaceAll]);35、floatValue := StringReplace(floatValue, ',', '', [rfReplaceAll]);36、i := pos('.', floatValue);37、if i > 0 then //有⼩数点38、begin39、intPart := Copy(floatValue, 1, i - 1);40、decPart := copy(floatValue, i + 1, Length(floatValue));41、//从后边开始清除042、for j := Length(decPart) downto 1 do43、begin44、if decPart[j] = '0'45、then Delete(decPart, j, 1)46、else47、Break;48、end;49、end50、else //⽆⼩数点52、intPart := floatValue;53、decPart := '';54、end;55、if decPart <> '' then56、numformat := '#,###,##0.' + StringOfChar('0', Length(decPart))57、else58、numFormat := '#,###,##0';59、Result := formatfloat(numFormat, StrToFloat(intPart + '.' + decpart));60、end;7) 请问怎么才能使DBGridEh不滚动就能提交数据?可以在关闭窗⼝时,判断⼀下数据集状态,然后⾃动保存。
Delphi操作Word的几个知识点

Delphi操作Wrod的几个知识点//-------------------初始化--------------------varwApp,work:Variant;trywApp:=GetActiveOleObject('word.Application');exceptwApp:=CreateOleObject('word.Application');end;//---------------替换字符--------------------wApp.selection.find.text:='<%a2%>';wApp.selection.find.replacement.text:=lb;wApp.selection.find.execute(replace:=wdReplaceAll);//----------------------隐藏WORD菜单和工具栏----------------------if OC.State in [osUIActive] thenbeginOC.OleObjectInterface.QueryInterface(IOleInPlaceObject,IOO);IOO.UIDeactivate;IOO :=nil;end;//-----------------根据书签导数据------wApp.Selection.GoTo(What:=wdGoToBookmark,Name:='ZCZD'+IntToStr(i));wApp.Selection.typetext('■')//-------------------生成页眉页脚并写入数据----------wApp.Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Name:='FLAG'); If wApp.ActiveWindow.View.SplitSpecial <> wdPaneNone ThenwApp.ActiveWindow.Panes(2).Close;If (wApp.ActiveWindow.ActivePane.View.Type = wdNormalView) Or(wApp.ActiveWindow.ActivePane.View.Type = wdOutlineView) ThenwApp.ActiveWindow.ActivePane.View.Type := wdPrintView;wApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader; wApp.Selection.ParagraphFormat.Borders.item(wdBorderLeft).LineStyle := wdLineStyleNone;wApp.Selection.ParagraphFormat.Borders.item(wdBorderRight).LineStyle := wdLineStyleNone;wApp.Selection.ParagraphFormat.Borders.item(wdBorderTop).LineStyle := wdLineStyleNone;wApp.Selection.ParagraphFormat.Borders.item(wdBorderBottom).LineStyle :=wdLineStyleNone;wApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageFooter; wApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphRight;if (DM.XM_DS.FieldByName('tg_flag').AsInteger = 2) and(DM.XM_DS.FieldByName('tj_flag').AsInteger = 0) thenwApp.Selection.TypeText(Text:='合`格`任`务`书')elsewApp.Selection.TypeText(Text:='不合格任务书');wApp.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;。
delphi导出数据至Excel的七种方法及比较
delphi导出数据至Excel的七种方法及比较一;delphi 快速导出exceluses ComObj,clipbrd;function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean;constxlNormal=-4143;vary : integer;tsList : TStringList;s,filename :string;aSheet :Variant;excel :OleVariant;savedialog :tsavedialog;beginResult := true;tryexcel:=CreateOleObject('Excel.Application');excel.workbooks.add;except//screen.cursor:=crDefault;showmessage('无法调用Excel!');exit;end;savedialog:=tsavedialog.Create(nil);savedialog.FileName:=sfilename; //存入文件savedialog.Filter:='Excel文件(*.xls)|*.xls';if savedialog.Execute thenbeginif FileExists(savedialog.FileName) thentryif application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes thenDeleteFile(PChar(savedialog.FileName))elsebeginExcel.Quit;savedialog.free;//screen.cursor:=crDefault;Exit;end;exceptExcel.Quit;savedialog.free;screen.cursor:=crDefault;Exit;end;filename:=savedialog.FileName;end;savedialog.free;if filename='' thenbeginresult:=true;Excel.Quit;//screen.cursor:=crDefault;exit;end;aSheet:=excel.Worksheets.Item[1];tsList:=TStringList.Create;//tsList.Add('查询结果'); //加入标题s:=''; //加入字段名for y := 0 to adoquery.fieldCount - 1 dobegins:=s+adoQuery.Fields.Fields[y].FieldName+#9 ; Application.ProcessMessages;end;tsList.Add(s);trytryADOQuery.First;While Not ADOQuery.Eof dobegins:='';for y:=0 to ADOQuery.FieldCount-1 dobegins:=s+ADOQuery.Fields[y].AsString+#9; Application.ProcessMessages;end;tsList.Add(s);ADOQuery.next;end;Clipboard.AsText:=tsList.Text;exceptresult:=false;end;finallytsList.Free;end;aSheet.Paste;MessageBox(Application.Handle,'数据导出完毕!','系统提示',MB_ICONINFORMATION or MB_OK);tryif copy(FileName,length(FileName)-3,4)<>'.xls' thenFileName:=FileName+'.xls';Excel.ActiveWorkbook.SaveAs(FileName, xlNormal, '', '', False, False);exceptExcel.Quit;screen.cursor:=crDefault;exit;end;Excel.Visible := false; //true会自动打开已经保存的excelExcel.Quit;Excel := UnAssigned;end;调用:ToExcel('D:\a.xsl',QueryToExcel);//路径可以自定义-------------------------------------------------------------------------------------------------*********************************************************************************** **************二;delphi如何导出EXCEL,代码。
Delphi数据库程序设计教程 第13章 报表的设计
13.1.3 TQRBand组件
该组件是一个重要的组件,当为TQuickRep组件设置Bands属性时,报表中就 会创建TQRBand组件。
1. BandType 该属性用来指定BandType组件的边条类型。边条的属性决定了最后在报表中该边 条出现的位置。 2. ForceNewColumn 该属性使报表在打印该边条前创建新的一列。 3. ForceNewPage 该属性使报表在打印该边条前生成新的一页。在列表类型的报表中,如果设置该 属性为True,那么报表的每页将仅仅显示一个记录。在主/明细报表中,如果设置 该属性为True,会使报表的每个主记录生成新的一页,与该主记录相对应的明细记 录均在该页中。 4. LinkBand LinkBand属性用来将报表和边条连接起来,被连接的边条作为当前的边条显示在同 一页中。当前页没有足够的空间打印该边条时,将生成新的一页。 5. HasChild属性 该属性为当前边条生成下一级边条。例如在主/明细报表类型的报表中,为某一个 字段设置该属性,将生成一个边条作为下一级的边条。
该组件是设置报表外观的主要组件,将TQuickRep组件加入到窗体中,它可以定位到窗 体上并扩展成全页的尺寸,给报表一个全页显示的可能。
(1) Bands 该属性是TQuickRep组件比较重要的属性,Bands属性是一个属性集。在设置这些属性时,每设 置一个属性为True,在TQuickRep组件中就会增加一个相应的TQRBand组件。 (2) DataSet 该属性指定主报表将从哪一个数据集中获得数据。对于简单的列表类型的报表中,通常使用一 个数据集。对于一个主/明细表,该属性应该设置为主数据集。 (3) Options Options属性集中有三个属性。FirstPageHeader为True时,在报表的第一页生成页头边条; LastPageFooter为True时,在报表的最后一页生成页脚边条;Compression为True时,以压缩格式 存储报表。 (4) Page 该属性集可以控制报表中页的大小、边、页的方向等。 (5) PrinterSettings 该属性集用来选择想要打印的副本数、打印的起始页和终止页,还可以选择是否需要重复打印 以及打印输出的途径。 (6) ReportTitle 该属性在标题的边条中显示标题,但通常要由TQRSysData组件来设置报表的标题。 (7) ShowProgress 该属性可以在准备和打印报表期间显示一个过程对话框。
用DELPHI操作EXCEL
用DELPHI操作EXCEL在DELPHI中显示EXCEL文件,可用以下简单代码做到。
但要实用,则需进一步完善。
varForm1: TForm1;EApp:variant;implementationuses ComObj, OleServer,Excel2000;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);beginEApp:=CreateOleObject('Excel.Application');Windows.SetParent(EApp.HWND,Panel1.Handle);EApp.Workbooks.Open('C:\a.xls');EApp.Visible:=true;end;以下内容的原贴地址:/fatice/blog/item/2197d451558bfd2342a75b 3a.htmlDELPHI中EXCEL组件的使用方法:一) 使用动态创建的方法首先创建 Excel 对象,使用ComObj:var ExcelApp: Variant;ExcelApp := CreateOleObject( 'Excel.Application' );1) 显示当前窗口:ExcelApp.Visible := True;2) 更改 Excel 标题栏:ExcelApp.Caption := '应用程序调用 Microsoft Excel';3) 添加新工作簿:ExcelApp.WorkBooks.Add;4) 打开已存在的工作簿:ExcelApp.WorkBooks.Open( 'C:\Excel\Demo.xls' );5) 设置第2个工作表为活动工作表:ExcelApp.WorkSheets[2].Activate;或ExcelApp.WorksSheets[ 'Sheet2' ].Activate;6) 给单元格赋值:ExcelApp.Cells[1,4].Value := '第一行第四列';7) 设置指定列的宽度(单位:字符个数),以第一列为例:ExcelApp.ActiveSheet.Columns[1].ColumnsWidth := 5;8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:ExcelApp.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米9) 在第8行之前插入分页符:ExcelApp.WorkSheets[1].Rows.PageBreak := 1;10) 在第8列之前删除分页符:ExcelApp.ActiveSheet.Columns[4].PageBreak := 0;11) 指定边框线宽度:ExcelApp.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;1-左 2-右 3-顶 4-底 5-斜( \ ) 6-斜( / )12) 清除第一行第四列单元格公式:ExcelApp.ActiveSheet.Cells[1,4].ClearContents;13) 设置第一行字体属性:ExcelApp.ActiveSheet.Rows[1] := '隶书';ExcelApp.ActiveSheet.Rows[1].Font.Color := clBlue;ExcelApp.ActiveSheet.Rows[1].Font.Bold := True;ExcelApp.ActiveSheet.Rows[1].Font.UnderLine := True;14) 进行页面设置:a.页眉:ExcelApp.ActiveSheet.PageSetup.CenterHeader := '报表演示';b.页脚:ExcelApp.ActiveSheet.PageSetup.CenterFooter := '第&P页';c.页眉到顶端边距2cm:ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;d.页脚到底端边距3cm:ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;e.顶边距2cm:ExcelApp.ActiveSheet.PageSetup.TopMargin := 2/0.035;f.底边距2cm:ExcelApp.ActiveSheet.PageSetup.BottomMargin := 2/0.035;g.左边距2cm:ExcelApp.ActiveSheet.PageSetup.LeftMargin := 2/0.035; h.右边距2cm:ExcelApp.ActiveSheet.PageSetup.RightMargin := 2/0.035; i.页面水平居中:ExcelApp.ActiveSheet.PageSetup.CenterHorizontally :=2/0.035;j.页面垂直居中:ExcelApp.ActiveSheet.PageSetup.CenterVertically := 2/0.035; k.打印单元格网线:ExcelApp.ActiveSheet.PageSetup.PrintGridLines := True;15) 拷贝操作:a.拷贝整个工作表:ed.Range.Copy;b.拷贝指定区域:ExcelApp.ActiveSheet.Range[ 'A1:E2' ].Copy;c.从A1位置开始粘贴:ExcelApp.ActiveSheet.Range.[ 'A1' ].PasteSpecial;d.从文件尾部开始粘贴:ExcelApp.ActiveSheet.Range.PasteSpecial;16) 插入一行或一列:a. ExcelApp.ActiveSheet.Rows[2].Insert;b. ExcelApp.ActiveSheet.Columns[1].Insert;17) 删除一行或一列:a. ExcelApp.ActiveSheet.Rows[2].Delete;b. ExcelApp.ActiveSheet.Columns[1].Delete;18) 打印预览工作表:ExcelApp.ActiveSheet.PrintPreview;19) 打印输出工作表:ExcelApp.ActiveSheet.PrintOut;20) 工作表保存:if not ExcelApp.ActiveWorkBook.Saved thenExcelApp.ActiveSheet.PrintPreview;21) 工作表另存为:ExcelApp.SaveAs( 'C:\Excel\Demo1.xls' );22) 放弃存盘:ExcelApp.ActiveWorkBook.Saved := True;23) 关闭工作簿:ExcelApp.WorkBooks.Close;24) 退出 Excel:ExcelApp.Quit;(二) 使用Delphi 控件方法在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksheet。
delphi操作word 2007
delphi操作word 2007-07-06 18:51:56分类:delphi操作word一、Delphi程序启动Word采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为:首先使用GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序,如果存在,则直接连接,如果没有Word程序,则使用CreateOleObject('Word.Application')启动Word二、Delphi程序新建Word文稿格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible) Template:使用模板的名称,NewTemplate:新建文档的类型,True表示为模板,False表示为文档DocumentType:文档类型,默认为空白文档Visible:打捞的窗口是否可见举例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:\Temlate.dot',NewTemp late:=False);三、Delphi程序打开Word文稿格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocum ent,PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate, Format,Encoding,Visible)FileName:文档名(包含路径)Confirmconversions:是否显示文件转换对话框ReadOnly:是否以只读方式打开文档AddToRecentFiles:是否将文件添加到"文件"菜单底部的最近使用文件列表中PassWordDocument:打开此文档时所需要的密码PasswordTemplate:打开此模板时所需要的密码Revert:如果文档已经,是否重新打开文档WritePasswordDocument:保存对文档更改时所需要的密码WritePasswordTemplate:保存对模板进行更改时所需要的密码Format:打开文档时所需使用的文件转换器Encoding:所使用的文档代码页Visible:打开文档的窗口是否可见举例:Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=Fals e,AddToRecentFiles:=False);四、Delphi程序保存Word文稿格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password, AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter)FileName:文件名。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用Word做Delphi报表输出工具
用Word做Delphi报表输出工具
崔先迤
笔者在实际应用中发现,报表的内容一般很少变动,但其字体格式及版式是经常变动
的,而且有时用户为了某种需要,不想修改数据库的真实内容而又要改变报表内容。
如果
用ReportSmith可以解决前者问题,但对于后者则无能为力了,且其界面是英文的,不合
用户习惯。
如果用3.0中的Qreport的报表部件,则两者都不能实时解决,必须修改原代码
后重新编译才能使用。
而使用Word及Excel则完全可以克服以上不足。
具体实现如下(以
Word实现为例):
首先用Word编辑报表格式,并排好版,把将要输出的数据项用表单域代替,并取名。
这里我们暂时假设有表单域Item1及Item2(均为文本型),将这个文档存为模板文件
Example.dot,然后按如下步骤进行:
1)运行Delphi3,在Form1里加入一个System部件集里的TDdeClientCov 部件,取名
为DdeExample,将其ConnectMode设为ddeManual(手动方式);将DdeService 设为
‘(WinWord)';将ServiceApplication设为‘WinWord'。
2)编写一个自定义过程,以激活Word,如下:
procedure Tform1.WordActive(Cmds: TStrings);
var
WordPath: String;
begin
if(not DdeExample.OpenLink) then {判断是否巳动态链接}
begin
if(FindWindow(′OpusApp′, nil)=0) then
begin
WordP ath := ′C:\msoffice\winword′;
if(WordPath=′′) then
ShowMessage(′中文Word未安装或未设置路径,请安装设置Word中文版。
′)
else
begin
DdeExample.ServiceApplication := WordPath+′\Winword.exe′;
if(DdeExample.OpenLink) {如果巳动态链接执行宏命令}
then DdeExample.ExecuteMacroLines(Cmds,False)
else ShowMessage(′无法启动Word中文版!′);
DdeExample.ServiceApplication := ′WinWord.exe′;
end;
end
else
begin{如果巳动态链接执行宏命令}
DdeExample.ExecuteMacroLines(Cmds,False);
end;
end
else
DdeExample.ExecuteMacroLines(Cmds,false);
end;
在private声明区里加入如下:
procedure ActiveWord(Cmds: TStrings);
3)在Form1中加入一个按钮Button1,在其onclick事件里写如下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
Cmds:TStringList;{创建Cmds}
TempItem1,TempItem2:String;
begin
cmds:=TStringList.Create;
cmds.Clear;
TempItem1:=′数据项一′;
TempItem2:=′数据项二′;
with Cmds do
begin
Clear;
Add(′[FileNew.Template = ″Example.Dot″]′);{打开模板文件Example.Dot}
Add(′[AppMaximize]′);{文档最大化}
Ad d(′[SetFormResult ″Item1″,″′+TempItem1+′″]′);{将数据TempItem1传
给表单域Item1}
Add(′[SetFormResult ″Item2″,″′+TempItem2+′″]);{将数据TempItem2传给
表单域Item2}
end;
WordActive(DdeExample,Cmds);{调用自定义过程}
Cmds.Free;{释放Cmds}
end;
运行这个程序,单击Button1,大家可以发现Word被启动了,屏幕上出现了&ldquo:
数据项一&rdquo;数据项二&rdquo两个数据项。
最后,大家可以任意修改本报表的格式及
数据,因为这时这个报表与具体的应用程序巳没有关系了。
本例中用的是中文Word6或中文Word7。
由于Word97的宏命令巳变为Visual Basic语
句,如大家想用Word97实现,请将其宏命令改变为相应的代码。
这是个简单的示例,大家可以利用Word的宏录制功能,录取更多的宏(如自动生成表
格、填充文字、变动字体等宏命令),并与数据库的各种表联系起来,依次加入Cmds中即
可实现您所要求的更复杂的功能。