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

1<dependency> 2 <groupId>com.mlsc</groupId> 3 <artifactId>aspose-cells</artifactId> 4 <version>8.3.1</version> 5</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文件,设置许可
1InputStream is = this.getClass().getClassLoader().getResourceAsStream("license.xml"); 2 3ByteArrayOutputStream dstStream = null; //填充后的文档输出流 4 5License aposeLic = new License(); 6aposeLic.setLicense(is);
license.xml内容如下:

1<License> 2 <Data> 3 <Products> 4 <Product>Aspose.Total for Java</Product> 5 <Product>Aspose.Words for Java</Product> 6 </Products> 7 <EditionType>Enterprise</EditionType> 8 <SubscriptionExpiry>20991231</SubscriptionExpiry> 9 <LicenseExpiry>20991231</LicenseExpiry> 10 <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber> 11 </Data> 12 <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature> 13</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,并绑定字段
1DataTable staffTable = new DataTable("staffList"); 2staffTable.getColumns().add("staff"); 3staffTable.getColumns().add("name"); 4staffTable.getColumns().add("sex"); 5staffTable.getColumns().add("post"); 6staffTable.getColumns().add("IDNum"); 7staffTable.getColumns().add("phoneNum");
(c)循环员工集合,构建新的DataTable,填充每一个员工的信息
1for (int i = 0; i < staffList.size(); i++) { 2 Staff staff = staffList.get(i); 3 DataRow row = staffTable.newRow(); 4 row.set(0, "员工信息"); 5 row.set(1, staff.getName()); 6 row.set(2, staff.getSex()); 7 row.set(3, staff.getPost()); 8 row.set(4, staff.getIDNum()); 9 row.set(5, staff.getPhoneNum()); 10 staffTable.getRows().add(row); 11}
(d)递归填充,替换文档中mergeField域字段
doc.getMailMerge().executeWithRegions(staffTable);
(e)单元格的合并,样式设置
1DocumentBuilder builder = new DocumentBuilder(doc); 2builder.moveToCell(0, 2, 0, 0); //移动到第一个表格的第3行第一个格子(即tableStart) 3builder.getCellFormat().setVerticalMerge(CellMerge.FIRST); 4 5for(int i = 1; i < staffList.size() + 1; i++ ) { 6 builder.moveToCell(0, 1 + i, 0, 0); 7 builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS); 8}
(e)保存并返回文件流
1dstStream = new ByteArrayOutputStream(); 2doc.save(dstStream, saveFormat); 3 4return dstStream.toByteArray(); //返回的文件流
4、填充结果文档
web项目可通过HttpServletResponse返回下载填充后的文档,例如在controller中,可如下处理

1response.setContentType("application/octet-stream; charset=utf-8"); 2 response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(genfileName, "utf-8").replace("+", "%20")); //genfileName要生成的文件名 3 4OutputStream out = response.getOutputStream(); 5 6out.write(outByte);
View Code
填充后的文档类容如下图:
