zoukankan      html  css  js  c++  java
  • C#按模板生成word文档总结

    最近项目做了个按模板生成word功能,总结如下

    1.首先得设计word模板

        一般段落字段用关建字来设置,比如:【项目名称】等。

        对于表格得用书签来设置了。具体操作:插入=》选择书签,给书签命名。

    2.替换模板中的关键字【...】.

       个人感觉用NPOI组件来实现比较容易。具体实现:在项目中用NuGet管理包来添加NPOI for .net。

       实现源码如下:

        string filepath = "word绝对路径";//
        //string filepath = Server.MapPath("word相对路径");
       using (FileStream stream = File.OpenRead(filepath))
       {
              XWPFDocument doc = new XWPFDocument(stream);
              #region 遍历段落经行修改
              var paragraphArray = doc.Paragraphs.Where(it => it.Text.Trim() != "").ToArray();
              for (int j = 0; j < paragraphArray.Count(); j++)
              {
                    var para = doc.Paragraphs.Where(it => it.Text.Trim() != "").ToArray()[j];
                    var text = para.Text;

                    var runs = para.Runs;

                   for (int i = 0; i < runs.Count; i++)
                   {
                        var run = runs[i];
                        text = run.ToString();
                       if (text.Contains("【XXX】"))
                       {
                             //进行文本替换

                             para.ReplaceText("【XXX】", "ABC");

                        }

                    }

                }
         }

    3.word模板中的书签替换为表格

         网上搜了好久没找到解决方案,你们要是有好的方案提供出来,大家一块学习进步。

         替换书签为table,我用微软自带的Microsoft.Office.Interop.Word来实现。

         实现源码如下:

        

    string filepath = Server.MapPath("word相对路径");
    Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
    Microsoft.Office.Interop.Word.Document doc1 = app.Documents.Add(filepath);
    app = doc1.Application;
    doc1.ActiveWindow.Visible = true;
    foreach (Microsoft.Office.Interop.Word.Bookmark bk in doc1.Bookmarks)
    {
    if (bk.Name == "标签名称")
    {
    Microsoft.Office.Interop.Word.Range range = bk.Range;
    range.Tables.Add(range, 3, 2);
    Microsoft.Office.Interop.Word.Table tb = range.Tables[1];
    tb.set_Style("网格型");
    tb.Cell(1, 1).Range.Text = "姓名";
    tb.Cell(1, 2).Range.Text = "成绩";
    tb.Cell(2, 1).Range.Text = "张三";
    tb.Cell(2, 2).Range.Text = "89";
    tb.Cell(3, 1).Range.Text = "李四";
    tb.Cell(3, 2).Range.Text = "98";

    }
    }
    doc1.SaveAs("保存到哪?");
    app.Quit();

    C#中操作Word(8)—— 向Word中插入图表的三种方法(一)

    https://blog.csdn.net/hyman_c/article/details/53156055

    C#中操作Word(9)—— 向Word中插入图表的三种方法(二)

    https://blog.csdn.net/hyman_c/article/details/53156105

    c#操作word图表(一)

    https://blog.csdn.net/handsomexiaominge/article/details/17185005

    微软的Microsoft.Office.Interop.Word  详解:

    1、创建Application对象

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

      我们创建的app对象就代表了整个的Word的进程,我们可以利用app对象进行word的进程的开启和关闭。

    2、获取文档对象

    Document doc = app.Documents.Open("D:\Test.docx");
     Application的Documents属性是一个存放Document对象容器,利于Documents的Open方法可以打开Word文件。打开后,文件中的所有文档都被存放到Documents中,open函数返回当前的ActiveDucument,也就是鼠标所在的文档对象。
    3、
    Range进行读操作和写操作
    可以通过doc对象的Range()方法获取Range对象,如果Range()不传入实参,则表示获取整个Document范围的Range:
        Range range = doc.Range();
            利用Console打印出来就是:
        Console.WriteLine(range.Text.ToString());                                //读的操作
    range = doc.Range(4, 10); range.Text = "新的测试文档"; doc.Save(); //写的操作


    Word的对象模型介绍


            Word中共有5种常用的对象模型:应用程序对象Application、文档对象Document、Selection对象、Range对象和Bookmark对象。
    下图显示了 Word 对象模型层次结构中这些对象的一个视图。


            初看起来,对象似乎重叠在一起。 例如,Document 和 Selection 对象都是 Application 对象的成员,但 Document 对象也是 Selection 对象的成员。 Document 和 Selection 对象都包含 Bookmark 和 Range 对象。 因为有多种方法可以访问相同类型的对象,所以存在重叠。 例如,你将格式设置应用于 Range 对象;但你可能想要访问当前选定内容、某一特定段落,某一节或整个文档的范围。
    下面分别介绍五种模型对象的含义和作用。

    2.1 Applicatin对象。


            Application 对象表示 Word 应用程序,并且是所有其他对象的父级。 其成员通常作为一个整体应用于 Word。 你可以使用其属性和方法来控制 Word 环境。
    在文档级项目中,可以通过使用 ThisDocument 类的 Application 属性来访问 Application 对象。

    2.2 Document对象


            Microsoft.Office.Interop.Word.Document 对象是 Word 编程的中心。 它表示一个文档及其所有内容。 当你打开文档或创建新文档时,将创建新的 Microsoft.Office.Interop.Word.Document 对象,并将其添加到 Application 对象的 T:Microsoft.Office.Interop.Word.Documents 集合。 具有焦点的文档被称为活动文档。 它由 Application 对象的 P:Microsoft.Office.Interop.Word._Application.ActiveDocument 属性表示。

    2.3 Selection对象


            Selection 对象表示当前所选的区域。 在 Word 用户界面中执行操作(如文本加粗)时,可以选择或突出显示文本,然后应用格式设置。 文档中始终存在 Selection 对象。 如果未选中任何内容,则它表示插入点。 此外,选定内容可包含多个不相邻的文本块。

    2.4 Range对象


            Range 对象表示文档中的相邻区域,并由起始字符位置和结束字符位置进行定义。 并不仅限于单个 Range 对象。 你可以在同一文档中定义多个 Range 对象。 Range 对象具有以下特性:
    · 它可以只包含单独的插入点,也可包含一个文本范围或整个文档。
    · 它包括非打印字符,如空格、制表符和段落标记。
    · 它可以是当前选定内容所表示的区域,也可以表示不同于此内容的区域。
    · 它在文档中不可见,这与选定内容不同,后者总是可见。
    · 它不随文档一起保存,且仅在代码运行时才存在。
     · 当在某个范围的末尾插入文本时,Word 会自动扩展该范围以包括插入的文本。

    2.5 Bookmark对象


            Microsoft.Office.Interop.Word.Bookmark 对象表示文档中的相邻区域,同时具有起始位置和结束位置。 你可以使用书签标记文档中的某个位置,也可将其作为文档中文本的容器。 Microsoft.Office.Interop.Word.Bookmark 对象可以包含插入点,也可以与整个文档一样大。Microsoft.Office.Interop.Word.Bookmark 具有下列特征,以将其与 Range 对象区别开来:
    · 你可以在设计时命名书签。
    · Microsoft.Office.Interop.Word.Bookmark 对象随文档一起保存,因此在代码停止运行或文档关闭时不会被删除。
    · 通过将 T:Microsoft.Office.Interop.Word.View 对象的 P:Microsoft.Office.Interop.Word.View.ShowBookmarks 属性设置为 false 或 true,可以隐藏或显示书签。

     可以学习下这个:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%B1%87/20293.shtml
     
  • 相关阅读:
    阿里P8架构师谈:阿里双11秒杀系统如何设计?
    秒杀系统设计的知识点
    秒杀系统架构优化思路
    秒杀系统解决方案
    Entity Framework Code First (七)空间数据类型 Spatial Data Types
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
  • 原文地址:https://www.cnblogs.com/skyfeng-826/p/9453687.html
Copyright © 2011-2022 走看看