Delphi和Word编程集锦

来源:互联网 发布:天下三女神捏脸数据 编辑:程序博客网 时间:2024/05/12 23:58

 用Delphi合并Word表格中单元格

//合并Word 表格中单元格
procedure mergeWordCell;
var WordApp: 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 ;

    
// ===== 创建对象 =====
    if not Assigned(WordApp) then                          
    begin
      WordApp:
= TWordApplication.Create(nil);
      WordApp.Visible :
= false;
    end;
    
if not Assigned(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
    
if Assigned(WordDoc) then     // ===== 关闭文件 =====
    begin
      WordDoc.Close;
      WordDoc.Disconnect;
      WordDoc.Destroy;
      WordDoc :
= nil;
    end;
    
if Assigned(WordApp) then      // ===== 关闭Word =====
    begin
      WordApp.Quit;
      WordApp.Disconnect;
      WordApp.Destroy;
      WordApp :
= nil;
    end;
  end;
end;

取得Word 表格中的数据

//取得Word 表格中的数据
procedure getWordCellStr;
var WordApp: 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 ;

    
// ===== 创建对象 =====
    if not Assigned(WordApp) then                          
    begin
      WordApp:
= TWordApplication.Create(nil);
      WordApp.Visible :
= false;
    end;
    
if not Assigned(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)==> 规则表
    For i := 1 To WordDoc.Tables.Count do      //第  i 个表
    begin                                      //第 iRow 行
      For iRow := 1 To WordDoc.Tables.Item(i).Rows.Count do      
      begin                                            
//第 iCol列
        For icol := 1 To WordDoc.Tables.Item(i).Columns.Count do
        begin
          myCell:
=WordDoc.Tables.Item(i).Cell(iRow,icol);
          memo1.Lines.add(myCell.Range.Text);
        end;
      end;
    end;
    
    
//方法(2)==> 不规则表:只有横向合并时
    For i := 1 To WordDoc.Tables.Count do              //第 i 个表
    begin
      For iRow :
= 1 To WordDoc.Tables.Item(i).Rows.Count do
      begin
        myRow:
=WordDoc.Tables.Item(i).Rows.Item(iRow);//第 iRow 行
        For icol := 1 To myRow.Cells.Count do         //第 iCol列
        begin
          myCell:
= myRow.Cells.Item(iCol) ;
          memo1.Lines.add(myCell.Range.Text);
        end;
      end;
    end;

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

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

取得Word文件的数据

//取得Word文件的数据
procedure getWordStr;
var WordApp: 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 ;

    
// ===== 创建对象 =====
    if not Assigned(WordApp) then                          
    begin
      WordApp:
= TWordApplication.Create(nil);
      WordApp.Visible :
= false;
    end;
    
if not Assigned(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
    
if Assigned(WordDoc) then              // ===== 关闭文件 =====
    begin
      WordDoc.Close;
      WordDoc.Disconnect;
      WordDoc.Destroy;
      WordDoc :
= nil;
    end;
    
if Assigned(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作为数据录入和输出的前端工具的系统设计思路,同样适用于其他语言的数据库系统开发,尤其适用于大量的数据处理的数据库系统