1. 程式人生 > >java使用Aspose向word模板寫入數據

java使用Aspose向word模板寫入數據

dep java open lpad -a size 打印 對象 pid

  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 = visitPersonsTable.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, 5, 0, 0);
builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);

for(int i = 1; i < staffList.size() + 1; i++ ) { 
      builder.moveToCell(0, 5 + 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模板寫入數據