首页 > 代码库 > 基于C#.NET的动态Word文档生成及数据填充研究

基于C#.NET的动态Word文档生成及数据填充研究

利用C#.NET设计的管理信息系统应用非常广泛,但其报表往往是利用水晶报表或其它工具形成固定式报表,这样不便于修改和电子文档的保存及传递,如果能将输出结果写入到Word文档中这样就解决了这个问题。现从以下几个方面介绍如何利用C#.NET来控制Word文档的操作。
1 利用C#.NET生成和设置Word文档
我们用VS2008中的C#.NET来实现的,所以要安装好VS2008。在编程之前必须从“项目”菜单上“添加引用”对话框的“COM”选硕卡中添加对类型库的引用,并在程序首部加入“usingWord;”这一引用。根据计算机上安装的Word版本,类型库将有所不同。例如,对于MicrosoftWord2003,类型库的名称为MicrosoftWord11.0Ob2
jectLibrary。
[1]
111 Word文档的建立
C#中要使用Word文档,先要定义一个Word应用,其格式是Word.Applicationmywordapp=newWord.Appli2cation();。第二步是要定义一个Word文档,应用语句Word.Documentnewdoc=newWord.Document();实现。第三步是定义一个对象用于记录文件名(包含文件所在的路径),对其进行初始化,并利用系统提供的文件函数判断其是否存在,如存在则利用系统函数将期删除,定义一对象,用于记录文件名(包含文件所在的路径)objectwfilename;将对象初始化wfilename=System.Windows.Forms.Application.StartupPath+“示例.doc”;判断文件是否已存在if(System.IO.File.Exists((string)wfilename));如果已存在就删除System.IO.File.Delete((string)wfilename);否则就建立一Word文档,在建立之前先定义一个对象用于Word文档建立时的参数传递,ObjectNoth2ing=System.Reflection.Missing.Value;最后通过Word应用建立一个指定路径的Word文档,newdoc=mywordapp.
Documents.Add(refNothing,refNothing,refNothing,refNothing);112 Word文档的页面设置
Word的页面设置一般包括,页面横纵向布局,纸张类型,页边距,页眉,页脚设置等,下面这段代码是将Word
页面设置为纵向布局,设置纸张类型为A4纸,上下左右边距为2厘米。
doc.PageSetup.Orientation=Word.WdOrientation.wdOrientLandscape;∥设置页面为纵向doc.PageSetup.PageWidth=WordApp.CentimetersToPoints(29.7F);∥设置纸张宽度

doc.PageSetup.PageHeight=WordApp.CentimetersToPoints(21F);∥设置纸张高度newdoc.PageSetup.TopMargin=57;∥设置上边距newdoc.PageSetup.BottomMargin=57;∥设置下边距newdoc.PageSetup.LeftMargin=57;∥设置左边距newdoc.PageSetup.RightMargin=57;∥设置右边距113 页眉页脚的添加与设置
页眉页脚是word文档中每个页面里上、下页边距界定的用于存储和显示文本、图形的信息区。页眉页脚常用于word文档的打印修饰,内容可以包括文档当前页页码、文档页数、文档建立日期时间、文档作者、文档标题、文档路径和文件名、公司徽标、边框线、特制图形等文字或图形。
mywordApp.ActiveWindow.View.Type=WdViewType.wdOutlineView;
mywordApp.ActiveWindow.View.SeekView=WdSeekView.wdSeekPrimaryHeader;mywordApp.ActiveWindow.ActivePane.Selection.InsertAfter(“[页眉内容]”
);mywordApp.Selection.ParagraphFormat.Alignment=myword.WdParagraphAlignment.wdAlignParagraphRight;∥
设置右对齐
mywordApp.ActiveWindow.View.SeekView=WdSeekView.wdSeekMainDocument;∥跳出页眉设置。
2 C#对Word当中表格的操作
211 创建表格及设置表格和单元格属性
objectautoFitBehavior=Word.WdAutoFitBehavior.wdAutoFitWindow;
newdoc.Content.Tables.Add(mywordApp.Selection.Range,表格行数,表格列数,refmissing,refautoFitBehav2ior);
212 合并单元格
newdoc.Content.Tables[1].Cell(i+1,j).Select();objectmoveUnit=Word.WdUnits.wdLine;objectmoveCount=1;
objectmoveExtend=Word.WdMovementType.wdExtend;
mywordApp.Selection.MoveUp(refmoveUnit,refmoveCount,refmoveExtend);mywordApp.Selection.Cells.Merge();
mywordApp.Selection.Cells.VerticalAlignment=Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;newdoc.Content.Tables[1].Cell(i+1,1).Range.Text=“单元格内容填充”;213 拆分单元格
Word.TablenewTable=newdoc.Tables[1];objectbeforeRow=newTable.Rows[1];newTable.Rows.Add(refbeforeRow);Word.Cellcell=newTable.Cell(1,1);cell.Merge(newTable.Cell(1,2));objectRownum=2;objectColumnnum=2;
cell.Split(refRownum,refColumnnum);214 添加行、添加列
newdoc.Content.Tables[0].Rows.Add(refbeforeRow);∥添加行newdoc.Content.Tables[0].Columns.Add(refbeforeColumn);∥添加列
?

3 用C#.NET将数据库中的数据写入Word文档
311 建立与数据库的连接
要将数据写入Word文档,首先要建立数据库的连接,这里应用的是ADO.NET的System.Data.OleDb技术来访问Access数据库。在使用此技术前要添加usingSystem.data.OleDb引用。具体应用分三部。
(1)在程序的公共部分定义一个连接。
OleDbConnectionmyConn=newOleDbConnection();(2)在页面载入部分添加以下代码来定义连接字符串。
stringconnstr=“provider=Microsoft.Jet.OLEDB.4.0;datasource=.\\basic.mdb”;myConn.ConnectionString=connstr;
(3)在每一个应用函数中用myConn.open();和myConn.clos();来打开和关闭连接。[2]
312 建立数据集实例
在程序中我们使用ADO.NET的DataReader类以连接方式从数据源读取数据。我们不能直接实例化Da2
taReader类,而是通过执行Command对象的ExecuteReader方法返回它的实例[1]。实例如以下代码。
[3]
stringsqlsr=“select3fromunit”;
OleDbCommandmycomm=newOleDbCommand(sqlsr,myConn);OleDbDataReaderdr=mycomm.ExecuteReader();313 数据写入Word文档
利用C#将程序中的数据的写入到Word文档中,在程序对变量中的数据处里好后可以用newdoc.Content.In2sertAfter(name);将name变量中的数据写入到Word文档当前位置的后面。用.InserBefore(name);将name变量中的数据写入到Word文档当前位置的前面。.InsertDateTime可以插入当前系统时间等等。设置字体是否为粗体用newdoc.Paragraphs.Last.Range.Font.Bold=0;当值为“0”时就不设为粗体,当为“1”时设为粗体,用newdoc.Par2agraphs.Last.Range.Font.Name=“字体名”;可以设置字体。用newdoc.Paragraphs.Last.Range.Font.Size=10;可以设置字体的大小。用newdoc.Paragraphs.Last.Alignment=Word.WdParagraphAlignment.wdAlignParagraphLeft;可以设置对齐方式。314 从剪贴板中获取数据
在内存中打开一个Word文档,将所选的内容复制到剪贴板中,这样我们就可以从剪贴板中取得数据,首先激活当前Word文档newdoc.ActiveWindow.Selection.WholeStory();第二步将选定的内容复制到剪贴板中newdoc.ActiveWindow.Selection.Copy();第三步定义对象IDataObjectdata=http://www.mamicode.com/Clipboard.GetDataObject();第四步获取data对象中的内容txtFileContent.Text=data.GetData(DataFormats.Text).ToString()。通过这几个步骤我们就可以获取内存中打开的Word文档中选定的内容并将其运用到我们所需要的地方。
4 用SQL语句进行查询和统计并将结果写入Word文档
SQL语句具有,综合统一,集数据定义、数据操纵、数据管理的功能于一体,语言风格统一,可以独立完成数据
库的全部操作;高度非过程化,提出“做什么”而不是“怎么做”面向集合的操作方式;两种使用方式和统一的语法结,SQL语言既是自含式语言,又是嵌人式语言,作为自含式语言,它可单独使用,用户在终端上直接键入SQL命令就可以实现对数据库进行操作;语言简洁,易学易用等特点。在我们的程序中应用SQL语语句将大大提高我们程序的效率。
SQL语句非常丰富,这里只对数据统计的数据分析常用到的聚合函数进行简单介绍及如何运用C#将其结果写入到Word中。
聚合函数又称列函数或者组函数是基于在一个值集(或一组值)中的某一特定的计算返回一个单一的值;当它们与SELECT语句的GROUPBY子句一起使用时每一个聚合函数为每一个组产生一个单一值,当不与GROUP
BY子句一起使用时是为整个表产生一单一值。表1为聚合函数简介

表1 聚合函数

函数名
返回值类型含  义
max()浮点型返回选择值中的最大值min()浮点型返回选择值中的最小值
count(3)整型返回一个SELECT语句的行数sum()浮点型计算选择值的和
avg()浮点型计算选择值的平均值stdev()浮点型计算选择值的标准差var()
浮点型
计算选择值的方差
表2 OleDbCommand的执行方法方法名
说  明
ExecuteNonQuery()返回受影响的行数ExecuteReader()返回SqlDataReader()对象ExecuteXmlReader()返回XmlReader对象ExecuteScaler()
返回结果中的首行首列
  要将SQL语句查询的结果写入的Word文档还要做一些准备工作,首先要建立一个与数据库的连接,前面我
们已经介绍了怎么建立一个与Access数据库的连接myConn;第二步定义一个OleDbCommand对象如mycmmd;第三步定义一CommandText用来设置数据源执行的Transact-SQL语句。第四步执行OleDbCommand对象,OleDb2Command对象有四种其说明见表2。这样就可以将OleDbCommand对象执行的结果负给程序中的变量,再用前面介绍的方法将数据写入到Word文档。
根据需要我们可以选择不同的OleDbCommand的执行方法来得到我们所需要的数据,下面是利用聚合函数中的coun(3)函数通过OleDbCommand的执行方法中的ExecuteScaler()返回jbqk表中的某一教学单位人员个数的例子。
stringsqlstr="selectcount(3)asmmfromjbqkwhere分类=’教学’and单位=’"+unitname+"’";
OleDbCommandmycmmd=newOleDbCommand(sqlstr,myConn);jx_n=(int)mycmmd.ExecuteScalar();
[6]
这样jx_n变中就存了某一教学单位人员个数,这样就可以通过C#将其写入到我们所需要的Word文档中的相应位置上去。其它的聚合函数和OleDbCommand的执行方法的用法和上面的用法相类似这里就不一一举例了。
5 结束语
利用C#控制Word主要目的是为了形成灵活可变的报表,这些报表可以做修改后发给需要它的人,并可以作为电子文档将其保存起来,以备今后的使用。C#对Word的操作非常丰富,文中只提及其基本的操作,希望能对读者有所帮助。

基于C#.NET的动态Word文档生成及数据填充研究