• 操作word文档(二)


    本文实例讲述了C#实现通过模板自动创建Word文档的方法,是非常实用的技巧。分享给大家供大家参考。具体实现方法如下:

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

    现通过具体的示例演示具体的步骤:
     
    第一步,制作模板
     
    1.新建一个文档,设置文档内容。
    2.在相应位置插入书签;将鼠标定位到要插入书签的位置,点击“插入”>“书签”,弹出对话框,输入书签名,点击“添加”按钮。
    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”,可以直接使用

    具体实现代码如下:(代码中有比较详细的注释)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    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列分别插入数据
     
    13.插入图片
    string picturePath = @"C:Documents and SettingsAdministrator桌面1.jpg";
    report.InsertPicture("Bookmark_picture",picturePath, 150, 150); //书签位置,图片路径,图片宽度,图片高度
     
    14.插入一段文字
    string text = "长期从事电脑操作者,应多吃一些新鲜的蔬菜和水果,同时增加维生素A、B1、C、E的摄入。为预防角膜干燥、眼干涩、视力下降、甚至出现夜盲等,电 脑操作者应多吃富含维生素A的食物,如豆制品、鱼、牛奶、核桃、青菜、大白菜、空心菜、西红柿及新鲜水果等。";
    report.InsertText("Bookmark_text",text);
     
    15.最后保存文档
    report.SaveDocument(RepPath); //文档路径
     
    第四步,运行程序生成文档,并查看生成的文档

  • 相关阅读:
    Linux系统介绍(二)文件系统结构
    为Docker Swarm添加调度策略
    Docker 三剑客之 Docker Swarm
    Hadoop中文文档
    hadoop 学习笔记:mapreduce框架详解
    Java进阶-- GUI
    ceph(8)--关于Ceph PGs
    今天在学习NTP时发现了2个网站
    开始学红帽的RHCE课堂有2次课了,要记下自己的学习经历
    Switch能否用string做参数
  • 原文地址:https://www.cnblogs.com/lichaoloveliangying/p/7955938.html
Copyright © 2020-2023  润新知