《电子技术应用》
您所在的位置:首页 > 其他 > 设计应用 > 编程实现Word表格的填充及扩展
编程实现Word表格的填充及扩展
殷爱贞1 徐 梅1 刘广孚2 何 洁3
1. 山东东营石油大学(华东)经济管理学院(257061); 2. 山东东营石油大学(华东)信息与控
摘要: 在软件中填充和扩展Word表格的实现原理及方法,并给出了VB程序示例。
关键词: Word RTF 表格 Visual Basic
Abstract:
Key words :

摘    要: 在软件中填充和扩展Word表格的实现原理及方法,并给出了VB程序示例。
关键词: Word  RTF  表格  填充  Visual Basic

   在一些软件的使用过程中,用户需要把计算结果生成一定格式的Word环境下的数据表格,以便直接插入到工作报告中。本文将介绍一种Word表格的自动填充方法。该方法利用Word文件的RTF(Rich Text Format)存储格式的特点,可满足用户的要求,并能进一步实现行列数可变的表格的生成。本方法简单有效,且无需Word软件的支持。
1  RTF格式简介
  Word文件有多种存储格式,除常用的“.doc”外,还有一种“.rtf”。本文将借助RTF格式实现对表格的操作。RTF是一种纯文本描述性的格式。文件内容全部为ASCII码,可用记事本打开,从而可以看到其全部的描述内容,也可以在应用软件中打开该文件并进行修改。表格的自动填充及扩展就是通过这种方式实现的。
在一个RTF格式的Word文件中,可以看到用“\”隔开的表示各种格式的字符串和数字,且Word版本越高其格式越复杂。但是只需知道几个有针对性的关键的格式字符串及其规律即可。
任何编程语言对文本文件和字符串的操作都比较简单,故用任何一种语言实现对表格的操作都将是简单可行的。
2  创建表格模板
   先要根据用户的需要,借助于Word软件创建表格模板文件,步骤如下。
  (1)运行Word软件,按照用户的要求插入表格,设置格式,并根据操作的需要预填单元格。表格模板示例如表1所示。

  (2)单击菜单的“文件/另存为”,文件类型选为“.rtf”,保存即可。此文件即为表格模板文件。
  (3)在程序中打开此文件,进行相应操作后,另存为新的目标文件。这就是用户需要的数据表格。
  (4)用户用Word软件打开该新文件,可看到填充后的表格,将该表格复制、粘贴到用户的Word文档中即可。
  下面以Visual Basic为例介绍如何实现对模板文件的操作。
3  表格的填充
   在RTF格式的模板文件的ASCII码中,可以看到类似“……\hich\af0\dbch\af15\loch\f0 AA22\cell……”的字符串。其中,“\cell”表示这是在描述一个单元格的格式及内容,“AA22”是单元格内容,前边的字符串是关于其字体、字号等格式的描述。
  RTF在格式描述符中极少用大写字母,且不会连续使用大写字母,例如有可能出现“Width”但不会出现“WIDTH”、“WI”及“A2”等字样。所以,如果每个单元格的内容都是大写字母或数字且互不相同(如表1),则它们在整个文件的描述字符串中就是惟一的。在软件中找到该惟一的特征字符串并用相应的字符串替换,就实现了表格的自动填充。由于这种填充方式只涉及单元格内容而与格式无关,所以预先创建的模板表格可以是任意复杂的,且每个单元格的字体、字号等格式也是任意的。
  在替换时如果有汉字,则应先将其转换成用ASCII码,如“日”要转换成“\′c8\′d5”(“日”的十六进制编码为“C8D5”)。
  实现表格自动填充的VB源代码如下:
  Private Sub FillGrid(MaxDimension As Integer,
    StrSourceFile As String,StrTargetFile As String,
      StrSource( ) As String,StrTarget( ) As String)
       '功能:替换RTF格式的模板源文件中的单元格内容,
       ′并生成新的RTF格式的目标文件
  ′MaxDimension为内容数组的维数,可以大于表格单元的总个数
     ′StrSourceFile和StrTargetFile分别为RTF格式的模板文件名和目标文件名
     ′StrSource( )和StrTarget( )分别为被替换单元的原始容内和新内容的字符串数组
     Dim i As Integer,S1 As String,P As Long
     LoadFileToStr StrSourceFile,S1′把模板文件读入到字符串S1中,源代码略
     For i=0 To MaxDimension-1
     P=InStr(S1,StrSource(i))′在源文件字符串中搜索将被替换的字符串的位置
        If P>0 Then ′如果找到则进行字符串替换在字符串替换时,因为新串可能比旧串长,
          ′所以不能使用串替换命令,而应把整个字符串分成3段,并重新组合
      S1=Left(S1,P-1)+StrTarget(i)+Mid(S1,P+Len
                   (StrSource(i)))
        End If
    Next i
       WriteStringToFile StrTargetFile,S1′写入目标文件,源代码略
  End Sub
  该程序的特点是参数表中数据字符串StrTarget( )的维数与当前表格单元格的个数无关。这是因为,一个软件一般支持多种数据类型,通常希望生成含有不同种类数据的多种表格。如果将每种数据均与某个互不相同的特征字符串绑定,所有特征字符串和数据均放在StrSource( )和StrTarget( )中,则不论表格有多大,该程序均完全适用。
4  增加表格的列数
  在有些应用软件中,要处理数据的种类(表格的列项)很多,但用户希望表格的列数可以任意变化。这时可采用对最少列数的标准表格模板任意增加列的方法,得到与模板表格的行数相同但列数任意多的表格。新列的格式与所选定的被复制列相同。
  下面介绍简单表格(整行整列)的增列方法。对于特殊表格的加列,则需根据具体情况编程,虽然程序复杂一些,但方法大同小异。
  一个有表格的RTF文件中,在该表格的描述字符串的前、后和中间都会有对该表格的坐标等很多参数的描述。其中最容易理解的是表格竖线的坐标描述,例如对于“cellx2732”,修改其数值会改变竖线的位置,而如果将2个“cellx***”间的描述串(不必知其具体含义)原地复制一遍(坐标值当然要做相应的修改),同时将描述相应单元格的以“ABC\cell”(“ABC”为单元格内容)为标志的描述串也原地复制一遍,则再次打开Word时,就会发现增加了一列。
  在下面的源代码中,为了简化程序,要求表格模板的单元格内容完全相同,并且扩充后的表格的单元格内容也完全相同,且等列宽。其实,要想使新表格中单元格内容各不相同并能任意设置列宽是很容易实现的。
  在表格中增加列的VB源代码如下:
  Private Sub ExpandVolumes(OldVols As Integer,
  CopiedVol As Integer,NewVols As Integer,
  MaxWidth As Integer,StrSourceFile As String,
  StrTargetFile As String,StrCell As String)
           ′功能:把表格的指定列(不能是第1列)进行复制,形成均匀列宽的多列表格
           ′说明:原始模板的单元格内容必须全部相同(为 Str
  ′Cell,如“ABC”),新单元格也按此填充
          ′OldVols、CopiedVol和NewVols分别为原始模板的列数、被复制列的序号和扩展后的列数
          ′MaxWidth为扩展后表格的宽度,此处只考虑4位数的情况
     Dim i As Integer,j As Integer,P1 As Long,StartP As Long
     Dim S1 As String,S2 As String
     Dim CellPos As Integer,StrTemp As String,ITemp As Integer
     LoadFileToStr StrSourceFile,S1′把模板文件读入到字符串S1中
     S2=″″′S2用于临时保存处理过的字符串
     Do′增加表格的列描述
     For i=1 To OldVols ′原始模板为3列
          P1=InStr(S1,″cellx″)′在余下的字符串中从起始查找
          If P1=0 Then′搜索完毕
       S1=S2+S1′转换完成的字符串仍赋给S1
         Exit Do
     End If
       If i=CopiedVol Then′复制指定列参数串并修改坐标值
       For j=CopiedVol To CopiedVol+NewVols-
    OldVols ′2 To NewVols-1
        S2=S2+Left(S1,P1+4)+Trim(Str(Int(MaxWidth/NewVols)*j))
        Next j
        ElseIf i<CopiedVol Then ′修改坐标值
             S2=S2+Left(S1,P1+4)+Trim(Str(Int(MaxWidth/ NewVols*i)))
  Else ′i>CopiedVol,修改坐标值
       S2=S2+Left(S1,P1+4)+Trim(Str(Int(MaxWidth/ NewVols*(i+NewVols-OldVols))))
     End If
         S1=Mid(S1,P1+9) ′剩余字符串
     Next i
  Loop
     S2=″″
     ITemp=Len(StrCell)
     Do ′增加表格单元格
      For i=1 To OldVols
          P1=InStr(S1,StrCell) ′搜索″ABC″
          If P1=0 Then ′搜索完毕
           S1=S2+S1 ′转换完成的字符串仍赋给S1
           Exit Do
        End If
           If i=CopiedVol Then′复制单元格
           For j=CopiedVol To CopiedVol+NewVols-OldVols
           S2=S2+Left(S1,P1+ITemp-1)
       Next j
  Else
         S2=S2+Left(S1,P1+ITemp-1)
      End If
           S1=Mid(S1,P1+ITemp) ′剩余字符串
     Next i
  Loop
        WriteStringToFile StrTargetFile,S1′保存成新的模板文件
  End Sub
  生成的新的模板文件的单元格内容是完全相同的,可以用各不相同的特征字符串逐一替换,形成如表1所示的表格模板后,就可以调用FillGrid进行自动填充了。
5  为表格增加行
  在RTF文件中,表格的描述是以行为单位的,所以增加行比增加列要容易得多。其描述符中,有一个出现频率不是很高的字符串“}\pard”,其中“}”是对一段完整描述内容的分隔(与“{”对应),而“\par”或“\pard”是一段描述内容的结束符。在只有一个表格的文件中,“}\pard”只在文件头结束(其后即为文件的全部内容的描述)及每行表格的描述结束时才出现。据此,就可以很容易地找到某行表格的完整的描述字符串,将其复制就可为表格增加一行,其实现非常简单。
6  结  论
  以上介绍了对任意固定表格的填充方法和对简单表格增加行列的方法。该方法的最大优点在于,只要编程者对RTF格式的文件进行简单分析并熟悉字符串的编程,就可以完成表格的操作。如果进一步对复杂表格的RTF文件进行分析,还可以继续编程实现对其行或列的添加,但如果其行列变化不多,建议多制几个标准表格模板则会更方便。
   当然,利用OLE编程也可以实现上述功能,但要求编程者必须熟悉OLE编程,且运行时必须有Word软件环境。在某些特殊场合(如用于工业实时控制的工控机上),为了避免感染病毒,是不允许安装Office等软件的,这时该种方法就显得更为实用。
参考文献
1   刘广孚.以读解的方式实现RTF文件的打印和预览.计算机应用研究(精扩本),2001
2   Microsoft Corporation著,希望图书创作室译.Microsoft  Visual Basic 6.0组件工具指南.北京:北京希望电子出版社,1999
3   Halvorson M著,希望图书创作室译.Microsoft Visual Basic  6.0专业版循序渐进教程.北京:北京希望电子出版社,1999
 

此内容为AET网站原创,未经授权禁止转载。