用Delphi合并Word表格中单元格

//合并Word表格中单元格
proceduremergeWordCell;
varWordApp:TWordApplication;
WordDoc:TWordDocument;
DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,
PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat:OleVariant;
i,iRow,iCol:integer;
myCell:Cell;
myRow:Row;
begin
memo1.Lines.Clear;

//=====创建对象=====
ifnotAssigned(WordApp)then
begin
WordApp:=TWordApplication.Create(nil);
WordApp.Visible:=false;
end;
ifnotAssigned(WordDoc)then
WordDoc:=TWordDocument.Create(nil);
try
DocInx:=1;
oFileName:='d: est.doc';
oReadOnly:=true;
CfCversions:=EmptyParam;
AddToRctFiles:=EmptyParam;
PswDocument:=EmptyParam;
PswTemplate:=EmptyParam;
oRevert:=EmptyParam;
WPswDocument:=EmptyParam;
WPswTemplate:=EmptyParam;
oFormat:=EmptyParam;
//=====打开文件=====
WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,
PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat);
//=====关联文件=====
WordDoc.ConnectTo(WordApp.Documents.Item(DocInx));

//合并第一、二列
iStart:=WordDoc.Tables.Item(i).Cell(1,1).Range.Start;
myCol:=WordDoc.Tables.Item(i).Columns.Item(2);
iEnd:=myCol.Cells.Item(myCol.Cells.Count).Range.End_;
myRange:=WordDoc.Range;
myRange.Start:=iStart;
myRange.End_:=iEnd;
myRange.Cells.Merge;

finally
ifAssigned(WordDoc)then//=====关闭文件=====
begin
WordDoc.Close;
WordDoc.Disconnect;
WordDoc.Destroy;
WordDoc:=nil;
end;
ifAssigned(WordApp)then//=====关闭Word=====
begin
WordApp.Quit;
WordApp.Disconnect;
WordApp.Destroy;
WordApp:=nil;
end;
end;
end;

取得Word 表格中的数据

//取得Word表格中的数据
proceduregetWordCellStr;
varWordApp:TWordApplication;
WordDoc:TWordDocument;
DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,
PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat:OleVariant;
i,iRow,iCol:integer;
myCell:Cell;
myRow:Row;
begin
memo1.Lines.Clear;

//=====创建对象=====
ifnotAssigned(WordApp)then
begin
WordApp:=TWordApplication.Create(nil);
WordApp.Visible:=false;
end;
ifnotAssigned(WordDoc)then
WordDoc:=TWordDocument.Create(nil);
try
DocInx:=1;
oFileName:='d: est.doc';
oReadOnly:=true;
CfCversions:=EmptyParam;
AddToRctFiles:=EmptyParam;
PswDocument:=EmptyParam;
PswTemplate:=EmptyParam;
oRevert:=EmptyParam;
WPswDocument:=EmptyParam;
WPswTemplate:=EmptyParam;
oFormat:=EmptyParam;
//=====打开文件=====
WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,
PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat);
//=====关联文件=====
WordDoc.ConnectTo(WordApp.Documents.Item(DocInx));

//方法(1)==>规则表
Fori:=1ToWordDoc.Tables.Countdo//第i个表
begin//第iRow行
ForiRow:=1ToWordDoc.Tables.Item(i).Rows.Countdo
begin//第iCol列
Foricol:=1ToWordDoc.Tables.Item(i).Columns.Countdo
begin
myCell:=WordDoc.Tables.Item(i).Cell(iRow,icol);
memo1.Lines.add(myCell.Range.Text);
end;
end;
end;

//方法(2)==>不规则表:只有横向合并时
Fori:=1ToWordDoc.Tables.Countdo//第i个表
begin
ForiRow:=1ToWordDoc.Tables.Item(i).Rows.Countdo
begin
myRow:=WordDoc.Tables.Item(i).Rows.Item(iRow);//第iRow行
Foricol:=1TomyRow.Cells.Countdo//第iCol列
begin
myCell:=myRow.Cells.Item(iCol);
memo1.Lines.add(myCell.Range.Text);
end;
end;
end;

//方法(3)==>不规则:横向、纵向合并时;任何表格
Fori:=1ToWordDoc.Tables.Countdo//第i个表
begin//第j个Cell
forj:=1ToWordDoc.Tables.Item(i).Range.Cells.Countdo
begin
myCell:=WordDoc.Tables.Item(i).Range.Cells.Item(j);
memo1.Lines.add(myCell.Range.Text);
end;
end;

finally
ifAssigned(WordDoc)then//=====关闭文件=====
begin
WordDoc.Close;
WordDoc.Disconnect;
WordDoc.Destroy;
WordDoc:=nil;
end;
ifAssigned(WordApp)then//=====关闭Word=====
begin
WordApp.Quit;
WordApp.Disconnect;
WordApp.Destroy;
WordApp:=nil;
end;
end;
end;

取得Word文件的数据

//取得Word文件的数据
proceduregetWordStr;
varWordApp:TWordApplication;
WordDoc:TWordDocument;
DocInx,oFileName,CfCversions,oReadOnly,AddToRctFiles,PswDocument,
PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat:OleVariant;
i,iRow,iCol:integer;
myCell:Cell;
myRow:Row;
begin
memo1.Lines.Clear;

//=====创建对象=====
ifnotAssigned(WordApp)then
begin
WordApp:=TWordApplication.Create(nil);
WordApp.Visible:=false;
end;
ifnotAssigned(WordDoc)then
WordDoc:=TWordDocument.Create(nil);
try
DocInx:=1;
oFileName:='d://est.doc';
oReadOnly:=true;
CfCversions:=EmptyParam;
AddToRctFiles:=EmptyParam;
PswDocument:=EmptyParam;
PswTemplate:=EmptyParam;
oRevert:=EmptyParam;
WPswDocument:=EmptyParam;
WPswTemplate:=EmptyParam;
oFormat:=EmptyParam;
//=====打开文件=====
WordApp.Documents.open(oFileName,CfCversions,oReadOnly,AddToRctFiles,
PswDocument,PswTemplate,oRevert,WPswDocument,WPswTemplate,oFormat);
//=====关联文件=====
WordDoc.ConnectTo(WordApp.Documents.Item(DocInx));

//方法(1):取整个文本的字符内容,包含表格
s:=WordDoc.Range.text;

//方法(2):取1--4位的字符,包含表格
myRange:=WordDoc.Range;
myRange.Start:=0;
myRange.End_:=4;

finally
ifAssigned(WordDoc)then//=====关闭文件=====
begin
WordDoc.Close;
WordDoc.Disconnect;
WordDoc.Destroy;
WordDoc:=nil;
end;
ifAssigned(WordApp)then//=====关闭Word=====
begin
WordApp.Quit;
WordApp.Disconnect;
WordApp.Destroy;
WordApp:=nil;
end;
end;
end;

Delphi+Word的数据库系统设计

Delphi擅长做数据库系统的开发,其功能强大,开发快速。但现在大多数的数据库系统80%的工作都是简单的增删改的工作,用数据库系统来实现增删改,存在录入不方便,录入内容简单等问题,尤其对于处理大量的文本和图片的数据库系统来说更是非常不便。报表输出还需要利用Delphi中各个版本提供的报表工具或第三方打印控件进行开发。虽然Delphi中提供的报表工具功能逐渐强大,使用愈加方便,但是如果想充分利用该报表工具开发强大实用的报表,仍得花费一定的精力去学习该报表组件的各个功能。例如Delphi6中提供的Qreport报表工具,对于制作复杂报表非常麻烦,也许BorLand也注意到了这个问题,所以到了Delphi7时,换成了Rave报表工具,该工具相比Qreport更易于使用,但如果要做出复杂的报表,仍需对它详细研究。

  在做文字处理的时候,中国的大多数用户还是习惯于使用Office,而Office中最常用的莫过于Word。因此大多数用户对于Word的操作应该说非常熟悉,而Word在数据录入方面功能之强大确实是无与伦比,在Word中无论简单的文本、表格还是图片等都能很轻松的录入,利用Word本身的打印功能还可以将其作为报表输出的工具。

  Delphi+Word的数据库系统设计思路

  结合Delphi和Word本身的特点,数据库系统可以采用这样的设计思路:以Word作为数据录入界面,录入完毕后,数据库系统自动从Word中提取数据,并将提取的各要素存储于数据表中,以便利用数据库系统的强大的数据处理功能对数据表内容进行维护、检索、统计等,并将Word作为报表输出的工具。//小新技术网www.xker.com

  Delphi中从Delphi5开始恰恰提供了与Word的接口—TwordApplication,利用该接口可以实现Word的打开、关闭、保存以及对文档内容作相应的处理。采用以上的系统设计思想以及Delphi提供的与Word的数据接口,笔者开发了一套成果管理系统。该成果管理系统主要内容是管理最终成果文档的内容,包括详细内容、文字图片、成果的储备情况、经费情况、获奖情况等,为了便于统计分析及保证成果内容的一致性,系统将各要素统一存放于数据表相应的字段中。下面详细阐述系统的设计思路,参见图1。


图1 系统设计思路流程图

  首先筛选必要的成果要素利用Word作一个录入模板。Word模板较常见的有两种做法:一种是在Word文档相应的位置插入书签;另一种是在Word文档的相应位置插入特殊符号。插入书签的具体做法是:选中要插入书签的区域,在Word的插入菜单中选择书签,填写书签名称,点击添加即可。在Word文档中插入特殊符号的思路是:将需要提取的内容用特殊字符包起来,系统利用特殊字符识别要导入的内容,例如#中国#,表示中国是要提取的内容。但是利用以上两种模板制作方法都有缺陷,尤其是将模板既作为输出界面,也将其作为录入界面时。首先对于利用书签的模板方法,用户在实际录入数据的过程中,很容易将书签误删除。插入特殊符号的方法无疑增加了用户录入时的负担,且界面也不美观,没有保持文档原貌。但这两种方法的基本思路都一样,即创造要提取要素的特征符号。

  借鉴以上两种模板设计方法的成功经验,笔者提出的模版设计思路是:成果的所有要素分门别类存储在Word文档的不同表格中,采用Word表格的具体要素—单元格作为文档内容的识别依据,系统根据Word表格中单元格的索引进行提取。但是这种设计思路必须能处理两种情况:一种是每个Word表格对应数据表中的一条记录即单元格数固定的情况;另一种是一个Word表格对应数据表中多行记录即单元格数可变的情况。现笔者开发的系统已完全能自如处理这两种情况。

  其次是成果文档的导入。导入时,一般存在两种情况:一是导入单个成果文档,二是同时导入多个成果文档即文件夹的方式。成果文档的导入实际上是Word文档内容的提取问题,提取的关键是成果文档中图片的提取以及成果详细内容的提取,在该系统中图片格式只能为BMP格式。对于成果详细内容,由于内容中有可能包括文本框、表格、图片等要素,因此采用了SQL Server中的Ntext类型字段。对于图片和详细内容的提取,都采用了剪贴板作为Word数据和数据表数据交换的媒介。导入时的另一个问题是单元格内容的判定,即如何判定当前单元格内容是数据表字段所需要的。

对于单元格数固定的表格,Word表格的单元格和数据表中的一条记录中的字段是一一对应的,但对于单元格数可变的情况,必须增加单元格内容判定的功能。同时导入多个文档时,存在要导入的文档或文件夹中含有其它Word文档的情况,因此必须对欲导入的文档进行身份识别。对应前面的模板设计方法,一般的识别方法是识别书签或者识别在文档的某个位置加上的特殊字符。但是这两种识别方法的缺陷也是显而易见的,识别标志容易误删除。

  但文档识别的基本思路是利用文档模板区别于其他文档的特征加以识别。借鉴已有的识别方法的成功经验,笔者提出的文档识别方法是:从成果模板本身的特征出发,用三个限制条件进行判断。一是成果文档中共有三个表格,二是成果文档的第一个表格共两行,三是成果文档的第三个表格共两行。以上三个限制条件足以保证成果文档的正确识别。当然不同的成果模板可以根据其具体特征进行具体分析,这是文档识别的基本思路。

  再次是成果文档的导出。导出时,依然以Word中的单元格作为识别单位。导出时的最常见问题是,对于多记录情况,Word表格应该能根据记录数的多少自动调整行数,且进行单元格的合并和拆分。在笔者开发的系统中,该问题也已成功解决。另外,从用户角度考虑,系统还实现了导出时将导出文档合一的功能即将多个文档导出为一个文档,大大方便了用户的浏览和编辑。

  为了充分发挥Delphi强大的数据管理功能,系统中同时提供了手工维护功能,即以传统的系统界面进行成果的增删改的功能,这样保证了修改内容和导出成果文档的一致性,同时又便于查询和统计。

  结论

  Delphi+Word的数据处理方式,可以实现系统的脱机使用,符合系统分布式布署的思想,同时又便于用户熟练掌握,符合系统集成的思想。这种全新的数据处理方式在笔者的系统中得到了较好的验证和使用,为以后的数据库系统开发提供了一条新的解决思路。采用Word作为数据录入和输出的前端工具的系统设计思路,同样适用于其他语言的数据库系统开发,尤其适用于大量的数据处理的数据库系统。

Delphi和Word编程集锦相关推荐

  1. 用Delphi进行word开发

    使用以CreateOleObjects方式调用Word 实际上还是Ole,但是这种方式能够真正做到完全控制Word文件,能够使用Word的所有属性,包括自己编写的VBA宏代码. ----------- ...

  2. Delphi与Word之间的融合技术

    问题:Delphi与Word之间的融合技术 ( 积分:0, 回复:325, 阅读:37835 ) 分类:OLE/Automation ( 版主:g622, satanmonkey ) 来自:yzhsh ...

  3. vb6中word编程总结

    1,在project\references 中加入microsoft word 9.0 object library 2, 启动word     Dim wApp As Word.Applicatio ...

  4. Delphi的Socket编程要分几步?

    Delphi的Socket编程要分几步? 2008-12-20 02:03:24 标签:Delphi Socket 编程 [推送到技术圈] ClientSocket 和ServerSocket 几个重 ...

  5. 《Delphi XE6 android 编程入门教程》推荐

    近5.6年已经没有看见关于delphi的新技术的书出来了(看来在国内delphi的使用量确实很低了), 高勇同学最近出了一本<Delphi XE6 android 编程入门教程>,上周刚拿 ...

  6. word表格转换成html,delphi将word表格转换成html_取得Word 表格中的数据

    delphi将word表格转换成html_取得Word 表格中的数据 1.delphi将word表格转换成html procedure TForm1.Button1Click(Sender: TObj ...

  7. Delphi操作Word,Excel替换

    有的时候想把数据库里的内容按某种格式写在Word,Excel里,在Word,Excel里按某种格式保存字段名称,下面以"%+字段名称+%"为例 一.Delphi 操作 Word 替 ...

  8. Delphi xe7并行编程快速入门

    现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...

  9. Delphi 操作Word实现粘贴板RTF格式内容替换

    最近在做一个功能,客户端调用一个网页,从网页上点击一个按钮,将格式文本复制到粘贴板,由于网页不支持设置粘贴板类型设置,导致往目标容器粘贴的时候格式丢失. 此时在delphi中操作粘贴板也无法实现,由于 ...

最新文章

  1. XML序列化以及新增节点XMLHelper
  2. 鸿蒙之境的称号,《神都夜行录》鸿蒙之境80级古都凶煞打法
  3. 理解java并发工具Phaser
  4. C++ template类模板实现栈 pop push
  5. [html] HTML5如何播放ts视频流?
  6. pytorch是否可以使用CUDA
  7. TensorFlow 深入MNIST
  8. python学习笔记10-匿名函数lambda
  9. RelativeLayout addRule踩坑之旅
  10. 安利个数据库工具dbeaver
  11. 10-4 linux可视化界面卡住问题等
  12. vue日历排班组件_VUE实现日历组件功能
  13. 看完《百家讲坛》之后的108个经典“留言”
  14. MATLAB :xlim 、 ylim 、zlim简介
  15. 大恒相机开发实践(3)——参数设置
  16. 当button具有disabled属性时,el-tooltip也失效。解决办法
  17. 计算机恢复原始桌面图标,如何将电脑界面上的图标恢复到原始样子?
  18. python 2.7上安装pymssql和pymysql
  19. 当当网总裁李国庆:亚马逊模式不适合中国
  20. 在Win10上使用BC3.1

热门文章

  1. json格式问题解决方式!
  2. 栅栏密码解码python实现
  3. JS生成唯一id方式介绍(UUID和NanoID)
  4. 二次规划问题的KKT 条件求解方法
  5. Apollo二次规划的应用之PWJ
  6. html 自动 浏览器窗口,一种html文件实现显示浏览器窗口内容的方法
  7. 多值依赖与部分函数依赖 转
  8. WAS以及weblogic日志说明
  9. 用数据说话,Python就业前景分析
  10. {“errcode“:48001,“errmsg“:“api unauthorized}