zoukankan      html  css  js  c++  java
  • java使用Aspose向word模板写入数据

      Aspose.Words是一个商业.NET类库,可以使得应用程序处理大量的文件任务。Aspose.Words支持Doc,Docx,RTF,HTML,OpenDocument,PDF,XPS,EPUB和其他格式。使用Aspose.Words可以在不使用Microsoft.Word的情况下生成、修改、转换和打印文档。

    1、Aspose在maven下的包引用,例如:

    <dependency>
       <groupId>com.mlsc</groupId>
       <artifactId>aspose-cells</artifactId>
       <version>8.3.1</version>
    </dependency>
    View Code

    2、word模板

        创建一个word文档,asposeTemplate.docx,内容如下:

    xxx部门人员信息表

     

    部门名称*

    $department$

     

    姓名

    性别

    职务

    身份证号

    联系电话

    «TableStart:staffList»«staff»

    «name»

    «sex»

    «post»

    «IDNum»

    «TableEnd:staffList»«phoneNum»

      

       

      说明:文档中的«name»等尖括号内容,是通过菜单的  “插入→文档部件→域”  找到 MergeField 并输入相应的域名而来。

    3、java代码实现模板填充

     (1)获取模板文件路径

      例如:在webapp/file文件夹下,String templateFilePath = request.getServletContext().getRealPath("") + "/files/asposeTemplate.docx";

    (2)获取aspose的许可证

      例如:通过配置的license.xml文件,设置许可

    InputStream is = this.getClass().getClassLoader().getResourceAsStream("license.xml");
    
    ByteArrayOutputStream dstStream = null; //填充后的文档输出流
    
    License aposeLic = new License();
    aposeLic.setLicense(is);

      license.xml内容如下:

    <License>
      <Data>
        <Products>
          <Product>Aspose.Total for Java</Product>
          <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
      </Data>
      <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
    </License>
    View Code

    (3)获取文档对象
      Document doc = new Document(templateFilePath);

    (4)填充word模板中$$占位字段

      doc.getRange().replace("$department$", data.getDepartment, true, false); //data.getDepartment 部门名称

    (5)填充word模板中«»占位字段

      (a)从数据源获取员工集合,如

    List<Staff> staffList = data.getStaffList();

      (b)创建名称为staffList的DataTable,并绑定字段

    DataTable staffTable = new DataTable("staffList");
    staffTable.getColumns().add("staff");
    staffTable.getColumns().add("name");
    staffTable.getColumns().add("sex");
    staffTable.getColumns().add("post");
    staffTable.getColumns().add("IDNum");
    staffTable.getColumns().add("phoneNum");

      (c)循环员工集合,构建新的DataTable,填充每一个员工的信息

    for (int i = 0; i < staffList.size(); i++) {
          Staff staff = staffList.get(i);
          DataRow row = staffTable.newRow();
          row.set(0, "员工信息");
          row.set(1, staff.getName());
          row.set(2, staff.getSex());
          row.set(3, staff.getPost());
          row.set(4, staff.getIDNum());
          row.set(5, staff.getPhoneNum());
          staffTable.getRows().add(row);
    }

      (d)递归填充,替换文档中mergeField域字段 

    doc.getMailMerge().executeWithRegions(staffTable);

      (e)单元格的合并,样式设置

    DocumentBuilder builder = new DocumentBuilder(doc);
    builder.moveToCell(0, 2, 0, 0);  //移动到第一个表格的第3行第一个格子(即tableStart)
    builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);
    
    for(int i = 1; i < staffList.size() + 1; i++ ) { 
          builder.moveToCell(0, 1 + i, 0, 0);
          builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
    }

      (e)保存并返回文件流

    dstStream = new ByteArrayOutputStream();
    doc.save(dstStream, saveFormat);
    
    return dstStream.toByteArray(); //返回的文件流

     4、填充结果文档

      web项目可通过HttpServletResponse返回下载填充后的文档,例如在controller中,可如下处理

    response.setContentType("application/octet-stream; charset=utf-8");
           response.setHeader("Content-Disposition", "attachment;  filename=" + URLEncoder.encode(genfileName, "utf-8").replace("+", "%20"));  //genfileName要生成的文件名
    
    OutputStream out = response.getOutputStream();
    
    out.write(outByte);
    View Code

      填充后的文档类容如下图:


       
        

  • 相关阅读:
    并发学习之:不使用内核对象同步的并发队列
    破解C#的readonly只读字段
    并发学习之:乱序执行和内存屏障
    并发学习之:缓存一致性
    并发学习之:Keyed Events(没看懂,要调试下才能明白,伤心!)
    静态和非静态的访问
    asc2码
    学习报告
    11号学习总结
    9号总结
  • 原文地址:https://www.cnblogs.com/super-yu/p/10395338.html
Copyright © 2011-2022 走看看