C#输出Word文档

来源:互联网 发布:三菱plc软件下载 编辑:程序博客网 时间:2024/06/11 20:43

 前一段时间在搞.net的一个项目,其中要求输出word和Excel,在网上找了找,常用的一些操作都有,不过我们用到了一些不常用的,这里一起总结总结。这里有两个自己认为比较好的小方法:1.这里如果项目中的输出的文档的形式是相对固定的,用模板文件去创建要输出的文档是个好的选择,这样输出的格式和速度都好于用程序动态输出。2.如果有些输出要求找不到可利用的有效代码,不防在office中录制个宏,参照VB的代码去写。

C# 进行Word的操作

C# 操作Word时需要添加的引用

using Microsoft.Office.Interop.Word;

 

Microsoft.Office.Interop.Word.Application wordApp =null;

Microsoft.Office.Interop.Word.Document wordDoc =null;

 

打开Word文档

public staticbool CreateWordDoc(stringfileName)

        {

            filePath = fileName;

            if(wordApp == null)

            {

                wordApp = new Microsoft.Office.Interop.Word.Application();

            }

            objectpath = templateFileName;

            objectmissing = System.Reflection.Missing.Value;

            objectreadOnly = false;

            try

            {

                wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;

                wordDoc =wordApp.Documents.Open(ref path,ref missing, refreadOnly,ref missing, refmissing,ref missing, refmissing,ref missing, refmissing,ref missing, refmissing,ref missing, refmissing,ref missing, refmissing,ref missing);

               // wordDoc =wordApp.Documents.Add(Type.Missing,Type.Missing, Type.Missing,Type.Missing);//根据模板创建Word文档

                returntrue;

            }

            catch(Exception e)

            {

                Console.WriteLine(e.Message);

                wordApp = null;

                wordDoc = null;

                returnfalse;

            }

        }       

书签快速定位

若是按照模板文件去创建输出的Word文档,其中可以很快的进行word文档的输出,对于定位叫困难的可以使用书签快速找到要插入或者替换的位置。

Bookmarks bks = wordDoc.Bookmarks;

bks[2].Range.Text = “This is the second Bookmark”; 

动态创建表格

有时候要生成的Word文档格式相不固定,需要根据实际情况去动态输出,动态输出的过程可以和我们手工编辑Word文档一样,有一定的顺序,最合乎我们思维的就是从头至尾的去用程序向Word文档中写数据。

Word中动态创建表格,如果连续创建表格可能会产生表格嵌套的问题,这个问题的产生主要是因为插入表格的位置没有准确的定位造成的。因此在需要连续插入多个表格的时候,在插入时要保证光标的位置是我们所期望的,API中有光标定位的方法。   

wordApp.Selection.EndKey(WdUnits.wdStory,);EndKey()方法有可以接受两个可选参数,第一个参数是光标移动至末尾的单元,类型为:Microsoft.Office.Interop.Word.WdUnits

第二个参数指定是否为扩展,是的话光标移动过程中的内容被选中。

因此为了避免产生表格嵌套的问题,在按顺序生成是,先将光标移动至文档的末尾,然后在另起一行进行表格的插入就不会产生问题了。如下面的方法中插入指定行数和列数的一个表格,同时对表格的样式进行设置。这样就可以创建形模板表格。

public staticTable CreatTable(introws,int columns)

        {

            if(wordDoc != null)

            {

                wordApp.Selection.EndKey(WdUnits.wdStory);// 光标移动至文档的末尾

               wordApp.Selection.TypeParagraph();//另起一段

Table t = wordDoc.Tables.Add(wordApp.Selection.Range,rows, columns,Type.Missing, Type.Missing);

  t.AllowAutoFit = true;//允许自适应大小               

  t.Range.Cells.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;//设置单元格竖直方向居中

  t.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle;//设置表格外边框样式

  t.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle;//设置表格内边框样式

  t.Range.Font.Size=11;//设置单元格字体大小为默认大小 11

  t.Range.Font.Bold = 0;//设置单元格字体加粗样式为:无,即不加粗

  t.Rows[1].HeadingFormat = -1;//设置换页表头重复

  t.Rows[1].Range.Bold = 2;//设置表头行字体加粗               

  return t;

            }

            else

            {

                returnnull;

            }

        }

复制单元格

复制一个单元格到另一个单元格中,下面的代码实现了将第四行第一列的内容复制都第四行第二列中去

先复制要复制的的单元格:Table.Cell(4,1).Range.Copy(Type.Missing);

然后将光标移动至要粘贴的单元格:Table.Cell(4,2).Select();

粘贴wordApp.Selection.Paste();

单元格写入内容

table.Cell(1, 1).Range.Text= "第一行第一列";//向表格第一行第一列中写入内容

合并单元格

table.Cell(2, 1).Merge(table.Cell(2,2))//将表格中的第二行的前两个单元格合并 

向文档中插入图片

Word中的表格,单元格,段落,行等都实现了Range接口,Range接口中的AddPicture()方法可以插入图片,如在表格中的第三行第一列的单元格中插入一张图片

Table.Cell(3,1).Range.InlineShapes.AddPicture("C:\\Users\\Green\\Desktop\\cat.png");

生成目录

有时候需要根据生成的内容动态的生成目录,生成目录的过程和我们手动生成目录的过程很相似,设置好不同得标题后,将光标移动至要插入目录的地方,选择目录。

那么用程序如何生成目录呢?大致可以分为两步:

第一步:设置标题的级别和样式

下面的方法可以在写Word文档时,指定目录中各级标题的样式,方法中只简单的加了两级标题,按顺序输出时,在需要设置标题的地方调用此方法,指定要输出的标题的内容和标题的级别即可。

public staticvoid WriteHeadLine(stringtext,WdOutlineLevel level)

        {

           float fontSize = level.Equals(WdOutlineLevel.wdOutlineLevel1) ? 15f : 12f;

           int fontBold = level.Equals(WdOutlineLevel.wdOutlineLevel1) ? 3 : 2;

           wordApp.Selection.EndKey(WdUnits.wdStory);

           wordApp.Selection.TypeParagraph();

           wordApp.Selection.Paragraphs.OutlineLevel = level;

           wordApp.Selection.Font.Size = fontSize;

           wordApp.Selection.Font.Bold = fontBold;

           wordApp.Selection.TypeText(text);

        }

第二步:在正文部分输出完成后,将光标定位至要生成目录的页的指定位置(即目录生成的起始位置),生成目录即可。

//下面的代码将光标移动至文档的第二页,具体在什么地方输出目录,就将光标移动至什么地方

wordApp.Selection.GoTo(WdGoToItem.wdGoToPage,Type.Missing,2,Type.Missing);

生成目录

wordApp.ActiveDocument.TablesOfContents.Add(wordApp.Selection.Range,true,"1","3", Type.Missing,"", true,true, Type.Missing,true,true, true);

           wordApp.Selection.InsertBreak(WdBreakType.wdLineBreak);

此方法的具体参数可以参考API中方法的参数说明,也可以录制宏手动生成目录,并设置目录的格式,然后参照VB代码进行调整。

文件保存操作

可以使用wordDoc.SaveAs()方法执行另存为操作,或者wordDoc.Save()方法进行保存,具体SavaAs()方法的参数可以参看API中方法的参数描述 

关闭Word应用程序和打开的Word文档

public staticvoid Close()

        {

            objectmissing = System.Reflection.Missing.Value;

            try

            {

                wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;//设置不弹出提示消息

                if(wordDoc != null)

                {

                    wordDoc.Close(ref missing,refmissing, ref missing);

                    //wordDoc.Close(refmissing, ref missing, ref missing);

                    wordDoc = null;

                }

                if(wordApp != null)

                {                  

                    wordApp.Quit(ref missing,refmissing, ref missing);                   

                }

 //wordApp.Quit()不能真正退出打开的应用时(没有仔细研究为啥不能退出),使用下面的方法,可以完全退出应用程序 这是在网上看到一个方法,确实有效        

 System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);

               wordApp = null;

            }

            catch(Exception e)

            {

                Console.WriteLine(e.Message);

            } 

        }

工作过程中在CSDN和博客园中看过不少前辈的帖子,很有启发。这里旨在总结自己的工作,有错误的地方还望各位大侠指出,讨论共同进步。

0 0
原创粉丝点击