zoukankan      html  css  js  c++  java
  • Aspose.Words 操作指北

    前言:    

           这段时间因为业务需求,需要做一个word 导出,表单式的那种,因为之前也做过NPOI 操作 Excel 这类型的问题,所以总以为word 导出应该挺简单的,一直没有研究这块,汗颜,天真大意了。查询了一批这样的资料,当然不可能穷极信息,所以选择了Aspose.Word 。自己总结了一点经验,也是在学习的时候写的,留下来给自己做个纪念。(话说我这记性真心烂,有知道怎么治的,求私信,求偏方)。


    使用场景:

    • 第一种:普通简单的导出word 一般是用于格式固定的,没有动态数据参与的。
    • 第二种:就是 有动态数据参与的,比如要生成一个员工的工作经历,需要每一次的工作生成一条数据。

    实现思路:

    • 第一种有两种实现思路:书签,域。
    • 第二种个人觉得只能通过代码来生成Cell一个一个单元格来堆叠。

    具体操作:

    • 书签
      1.  新建一个word,随便画一个Table。
      2. image       
      3. image
      4. image
      5. 一个萝卜一个坑的吧书签给设置好。下来就是代码阶段。
        #region 使用书签替换模式
        
                    Bookmark bookmark = doc.Range.Bookmarks["dier"];
        
                    if (bookmark != null)
                    {
                        bookmark.Text = "";
                    }
        
                    bookmark = doc.Range.Bookmarks["tel"];
        
                    if (bookmark != null)
                    {
                        bookmark.Text = "1862029207*";
                    }
        
                    #endregion
        
                    doc.Save("D://Test.doc");
        View Code

                         6. 以上就是书签的使用了,虽然我只填了两个坑。

                                  image

                           昨天写了一半,然后觉得再看看,现在再添两个方法。来自  悟 

            首先得提一下 域  模板的制作,如图:

            

          比如姓名后面的《》不是手动输入上去的,正确的操作是:Ctrl+F9 

                           

                             然后右键编辑域

                 

                以上!!!模板完事了。

          下面记录一下应用上面的模板生成word。      

            public void Yu_ShuZu()
            {
                string fielname = Server.MapPath("../UploadFile/file_can_not_del/word_yu.docx");
    
                Document doc = new Document(fielname);
    
                #region 使用数组
    
                //使用数组
                String[] fieldNames = new String[] { "Name", "Age", "BirthDay", "Sex" };
    
                Object[] fieldValues = new Object[] { "张三", "15", "1988-09-02", "" };
    
                //合并模版,相当于页面的渲染
                doc.MailMerge.Execute(fieldNames, fieldValues);//Execute();
    
                #endregion
    
                doc.Save("D://yu_ShuZu.docx");
    
                //输出到前端
                //doc.Save(Page.Response, "C010.doc", ContentDisposition.Attachment, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
            }

          然后输出:

            

          以上是以数组为数据源输出,下面说一下以DataTable 为数据源进行数据绑定输出word:

          首先是设定一下模板:

          由于是DataTable 为数据源 在此就需要在原来的基础上再添加两个域标签,《TableStart:UserInfo》《TableEnd:UserInfo》分别放在原有域标签的首尾,用于表示中间的那些域标签是出自于名为:UserInfo 的DataTable 中提供数据。

              

          以上是模板。

          下面是代码:

            public void Yu_DataTable()
            {
                DataTable dt = new DataTable("UserInfo");
    
                dt.Columns.Add("Name");
    
                dt.Columns.Add("Age");
    
                dt.Columns.Add("Sex");
    
                dt.Columns.Add("Birthday");
    
                DataRow dr1 = dt.NewRow();
    
                dr1["Name"] = "张三";
    
                dr1["Age"] = "11";
    
                dr1["Sex"] = "";
    
                dr1["Birthday"] = "1920-01-01";
    
                dt.Rows.Add(dr1);
    
                string fielname = Server.MapPath("../UploadFile/file_can_not_del/word_yu.doc");
    
                Document doc = new Document(fielname);
    
                //TableStart: UserList - TableEnd:UserList---- - 得在首尾加这俩
                doc.MailMerge.ExecuteWithRegions(dt);//
    
                doc.Save("D://yu_DataTable.docx");
            }

          输出结果:

          

          遇到的问题:

      1. 以DataTable 为数据源的时候,难道必须在同一个截面,也就是一行?这就尴尬了。
      2. 还有就是在生成Word的时候,需要循环输出tr的时候,该怎么做,目前我就是直接生成Cell的。
      3. 有知道的朋友希望不吝赐教!!!
      4. 最后再来一个别的牛人的彩蛋

          

          

          

  • 相关阅读:
    关于session
    bootstrap的栅格系统
    js小知识点
    js获取div基础元素
    fixed固定元素
    定时器之延时触发鼠标悬浮事件
    Comparator分组测试
    List去重比较
    点击事件和双击事件
    开机自启动
  • 原文地址:https://www.cnblogs.com/houlin/p/7485695.html
Copyright © 2011-2022 走看看