zoukankan      html  css  js  c++  java
  • C#程序通过模板自动创建Word文档

    引言:前段时间有项目要用c#生成Word格式的计算报告,通过网络查找到很多内容,但是都很凌乱,于是自己决定将具体的步骤总结整理出来,以便于更好的交流和以后相似问题可以迅速的解决!

    现通过具体的示例演示具体的步骤:

     

    第一步,制作模板

        1,新建一个文档,文档内容如下:

    2,在相应位置插入书签;将鼠标定位到要插入书签的位置,点击“插入”>“书签”,弹出对话框,输入书签名,点击“添加”按钮,书签位置如图3所示

    3,保存模板,命名为“模板1.dot”或者“模板1.doc”

    第二步,设置项目中的引用

        1,右击“解决方案资源管理器”中的项目目录下的“引用”,选择“添加引用”,打开“添加引用”对话框

    2,在“添加引用”对话框中,选择“COM”>“Microsoft Word 11.0 Object Library”,点击“确定”按钮

     3,相同操作打开“添加引用”对话框中,选择“浏览”项,查找到”Microsoft.Office.Interop.Word.dll”文件,选中它,点击“确定”按钮

    注意:此处要查找的“Microsoft.Office.Interop.Word.dll”版本必须为“11.*.*.*”,“*”代表数字

    第三步,编码

    这一步分成两个部分

    第一部分,Report类的编码

    这部分我已经封装好,为文件“Report.cs”,可以直接使用

    代码如下:(有比较详细的注释)

    using System;

    using System.Collections.Generic;

    using System.Text;

    using Microsoft.Office.Interop.Word;

     

    namespace MYNAMESPACE  //这边需要换成自己的命名空间名

    {

        classReport

        {

            private_ApplicationwordApp= null;

            private_DocumentwordDoc= null;

            public_ApplicationApplication

            {

                get

                {

                    return wordApp;

                }

                set

                {

                    wordApp = value;

                }

            }

            public_DocumentDocument

            {

                get

                {

                    return wordDoc;

                }

                set

                {

                    wordDoc = value;

                }

            }

     

            //通过模板创建新文档

            publicvoidCreateNewDocument(stringfilePath)

            {

                killWinWordProcess();

                wordApp= new ApplicationClass();

                wordApp.DisplayAlerts =WdAlertLevel.wdAlertsNone;

                wordApp.Visible =false;

                objectmissing =System.Reflection.Missing.Value;

                objecttemplateName =filePath;

                wordDoc= wordApp.Documents.Open(reftemplateName, refmissing,

                    ref missing, ref missing,ref missing, ref missing, refmissing,

                    ref missing, ref missing,ref missing, ref missing, refmissing,

                    ref missing, ref missing,ref missing, ref missing);

            }

     

            //保存新文件

            publicvoidSaveDocument(stringfilePath)

            {

                objectfileName =filePath;

                objectformat =WdSaveFormat.wdFormatDocument;//保存格式

                objectmiss =System.Reflection.Missing.Value;

                wordDoc.SaveAs(reffileName, ref format, ref miss,

                    ref miss, ref miss,ref miss, ref miss,

                    ref miss, ref miss,ref miss, ref miss,

                    ref miss, ref miss,ref miss, ref miss,

                    ref miss);

                //关闭wordDoc,wordApp对象

                objectSaveChanges =WdSaveOptions.wdSaveChanges;

                objectOriginalFormat =WdOriginalFormat.wdOriginalDocumentFormat;

                objectRouteDocument =false;

                wordDoc.Close(refSaveChanges, refOriginalFormat, refRouteDocument);

                wordApp.Quit(refSaveChanges, refOriginalFormat, refRouteDocument);

            }

     

            //在书签处插入值

            publicboolInsertValue(stringbookmark, stringvalue)

            {

                objectbkObj =bookmark;

                if(wordApp.ActiveDocument.Bookmarks.Exists(bookmark))

                {

                    wordApp.ActiveDocument.Bookmarks.get_Item(refbkObj).Select();

                    wordApp.Selection.TypeText(value);

                    return true;

                }

                returnfalse;

            }

     

            //插入表格,bookmark书签

            publicTableInsertTable(stringbookmark, int rows, int columns,float width)

            {

                objectmiss =System.Reflection.Missing.Value;

                objectoStart =bookmark;

                Rangerange =wordDoc.Bookmarks.get_Item(refoStart).Range;//表格插入位置

                TablenewTable =wordDoc.Tables.Add(range,rows, columns, ref miss, refmiss);

                //设置表的格式

                newTable.Borders.Enable =1; //允许有边框,默认没有边框(为0时报错,1为实线边框,2、3为虚线边框,以后的数字没试过)

                newTable.Borders.OutsideLineWidth=WdLineWidth.wdLineWidth050pt;//边框宽度

                if(width != 0)

                {

                    newTable.PreferredWidth=width;//表格宽度

                }

                newTable.AllowPageBreaks =false;

                returnnewTable;

            }

     

            //合并单元格 表名,开始行号,开始列号,结束行号,结束列号

            publicvoidMergeCell(Microsoft.Office.Interop.Word.Tabletable, int row1, int column1,int row2, int column2)

            {

                table.Cell(row1,column1).Merge(table.Cell(row2,column2));

            }

     

            //设置表格内容对齐方式Align水平方向,Vertical垂直方向(左对齐,居中对齐,右对齐分别对应Align和Vertical的值为-1,0,1)

            publicvoidSetParagraph_Table(Microsoft.Office.Interop.Word.Tabletable, int Align, int Vertical)

            {

                switch(Align)

                {

                    case -1:table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphLeft;break;//左对齐

                    case 0: table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphCenter;break;//水平居中

                    case 1: table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphRight;break;//右对齐

                }

                switch(Vertical)

                {

                    case -1: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalTop;break;//顶端对齐

                    case 0: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalCenter;break;//垂直居中

                    case 1: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalBottom;break;//底端对齐

                }

            }

     

            //设置表格字体

            publicvoidSetFont_Table(Microsoft.Office.Interop.Word.Tabletable, string fontName, double size)

            {

                if(size != 0)

                {

                    table.Range.Font.Size =Convert.ToSingle(size);

                }

                if(fontName !="")

                {

                    table.Range.Font.Name =fontName;

                }

            }

     

            //是否使用边框,n表格的序号,use是或否

            publicvoidUseBorder(int n,bool use)

            {

                if(use)

                {

                    wordDoc.Content.Tables[n].Borders.Enable =1;  //允许有边框,默认没有边框(为0时无边框,1为实线边框,2、3为虚线边框,以后的数字没试过)

                }

                else

                {

                    wordDoc.Content.Tables[n].Borders.Enable =2;  //允许有边框,默认没有边框(为0时无边框,1为实线边框,2、3为虚线边框,以后的数字没试过)

                }

            }

     

            //给表格插入一行,n表格的序号从1开始记

            publicvoidAddRow(int n)

            {

                objectmiss =System.Reflection.Missing.Value;

                wordDoc.Content.Tables[n].Rows.Add(refmiss);

            }

     

            //给表格添加一行

            publicvoidAddRow(Microsoft.Office.Interop.Word.Tabletable)

            {

                objectmiss =System.Reflection.Missing.Value;

                table.Rows.Add(refmiss);

            }

     

            //给表格插入rows行,n为表格的序号

            publicvoidAddRow(int n, int rows)

            {

                objectmiss =System.Reflection.Missing.Value;

                Microsoft.Office.Interop.Word.Tabletable = wordDoc.Content.Tables[n];

                for(inti = 0; i < rows; i++)

                {

                    table.Rows.Add(refmiss);

                }

            }

     

            //给表格中单元格插入元素,table所在表格,row行号,column列号,value插入的元素

            publicvoidInsertCell(Microsoft.Office.Interop.Word.Tabletable, int row, int column,string value)

            {

                table.Cell(row,column).Range.Text =value;

            }

     

            //给表格中单元格插入元素,n表格的序号从1开始记,row行号,column列号,value插入的元素

            publicvoidInsertCell(int n, int row,int column, string value)

            {

                wordDoc.Content.Tables[n].Cell(row,column).Range.Text =value;

            }

     

            //给表格插入一行数据,n为表格的序号,row行号,columns列数,values插入的值

            publicvoidInsertCell(int n, int row,int columns, string[] values)

            {

                Microsoft.Office.Interop.Word.Tabletable = wordDoc.Content.Tables[n];

                for(inti = 0; i < columns; i++)

                {

                    table.Cell(row,i + 1).Range.Text =values[i];

                }

            }

     

            //插入图片

            publicvoidInsertPicture(stringbookmark, stringpicturePath, floatwidth, float hight)

            {

                object miss = System.Reflection.Missing.Value;

                objectoStart =bookmark;

                ObjectlinkToFile =false;       //图片是否为外部链接

                ObjectsaveWithDocument =true;  //图片是否随文档一起保存

                objectrange =wordDoc.Bookmarks.get_Item(refoStart).Range;//图片插入位置

                wordDoc.InlineShapes.AddPicture(picturePath,ref linkToFile, ref saveWithDocument, refrange);

                wordDoc.Application.ActiveDocument.InlineShapes[1].Width=width;  //设置图片宽度

                wordDoc.Application.ActiveDocument.InlineShapes[1].Height=hight; //设置图片高度

            }

     

            //插入一段文字,text为文字内容

            publicvoidInsertText(stringbookmark, stringtext)

            {

                objectoStart =bookmark;

                objectrange =wordDoc.Bookmarks.get_Item(refoStart).Range;

                Paragraphwp =wordDoc.Content.Paragraphs.Add(refrange);

                wp.Format.SpaceBefore= 6;

                wp.Range.Text =text;

                wp.Format.SpaceAfter =24;

                wp.Range.InsertParagraphAfter();

                wordDoc.Paragraphs.Last.Range.Text =" ";

            }

     

            //杀掉winword.exe进程

            publicvoidkillWinWordProcess()

            {

                System.Diagnostics.Process[]processes=System.Diagnostics.Process.GetProcessesByName("WINWORD");

                foreach (System.Diagnostics.Processprocess in processes)

                {

                    bool b = process.MainWindowTitle=="";

                    if (process.MainWindowTitle =="")

                    {

                        process.Kill();

                    }

                }

            }

        }

    }

    第二部分,具体生成文档的编码

    代码见下文:

    1,首先需要载入模板

    Report report =new Report();

    report.CreateNewDocument(TemPath); //模板路径

    2,插入一个值

    report.InsertValue("Bookmark_value","世界杯");//在书签“Bookmark_value”处插入值

    3,创建一个表格

    Table table =report.InsertTable("Bookmark_table", 2, 3, 0); //在书签“Bookmark_table”处插入2行3列行宽最大的表

    4,合并单元格

    report.MergeCell(table, 1, 1, 1, 3); //表名,开始行号,开始列号,结束行号,结束列号

    5,表格添加一行

    report.AddRow(table); //表名

    6,在单元格中插入值

    report.InsertCell(table, 2, 1,"R2C1");//表名,行号,列号,值

    7,设置表格中文字的对齐方式

    report.SetParagraph_Table(table, -1, 0);//水平方向左对齐,垂直方向居中对齐

    8,设置表格字体

    report.SetFont_Table(table,"宋体", 9);//宋体9磅

    9,给现有的表格添加一行

    report.AddRow(1);//给模板中第一个表格添加一行

    10,确定现有的表格是否使用边框

    report.UseBorder(1,true); //模板中第一个表格使用实线边框

    11,给现有的表格添加多行

    report.AddRow(1, 2);//给模板中第一个表格插入2行

    12,给现有的表格插入一行数据

    string[] values={"英超", "意甲", "德甲","西甲", "法甲" };

    report.InsertCell(1, 2, 5,values); //给模板中第一个表格的第二行的5列分别插入数据

    12,插入图片

    string picturePath = @"C:Documents and SettingsAdministrator桌面1.jpg";

    report.InsertPicture("Bookmark_picture",picturePath, 150, 150); //书签位置,图片路径,图片宽度,图片高度

    13,插入一段文字

    string text = "长期从事电脑操作者,应多吃一些新鲜的蔬菜和水果,同时增加维生素A、B1、C、E的摄入。为预防角膜干燥、眼干涩、视力下降、甚至出现夜盲等,电 脑操作者应多吃富含维生素A的食物,如豆制品、鱼、牛奶、核桃、青菜、大白菜、空心菜、西红柿及新鲜水果等。";

    report.InsertText("Bookmark_text",text);

    14,最后保存文档

    report.SaveDocument(RepPath); //文档路径

    第四步,运行程序生成文档,并查看生成的文档

  • 相关阅读:
    【QTP】自动化测试:
    sql基本语句
    【转】ASP.NET网站怎么发布web项目程序和怎么部署
    NHibernate的简单例子
    解决ehcache的UpdateChecker问题
    正则表达式的贪婪与懒惰
    Linux查找文件夹名
    centos安装lxml和pyspider
    如何通过写一个chrome扩展启动本地程序
    网页图片滚动效果
  • 原文地址:https://www.cnblogs.com/gc2013/p/3978514.html
Copyright © 2011-2022 走看看