java使用Aspose向word模板写入数据

java

  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

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


   
    

以上是 java使用Aspose向word模板写入数据 的全部内容, 来源链接: utcz.com/z/391077.html

回到顶部