Aspose.Words是一個商業.NET類庫,能夠使得應用程序處理大量的文件任務。Aspose.Words支持Doc,Docx,RTF,HTML,OpenDocument,PDF,XPS,EPUB和其餘格式。使用Aspose.Words能夠在不使用Microsoft.Word的狀況下生成、修改、轉換和打印文檔。java
一、Aspose在maven下的包引用,例如:web


<dependency> <groupId>com.mlsc</groupId> <artifactId>aspose-cells</artifactId> <version>8.3.1</version> </dependency>
二、word模板app
建立一個word文檔,asposeTemplate.docx,內容以下:webapp
xxx部門人員信息表maven
部門名稱*ide |
$department$post |
||||
姓名ui |
性別this |
職務spa |
身份證號 |
聯繫電話 |
|
«TableStart:staffList»«staff» |
«name» |
«sex» |
«post» |
«IDNum» |
«TableEnd:staffList»«phoneNum» |
說明:文檔中的«name»等尖括號內容,是經過菜單的"插入→文檔部件→域」找到MergeField並輸入相應的域名而來。
三、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>
(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(); //返回的文件流
四、填充結果文檔
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);
填充後的文檔類容以下圖: