使用Aspose.Words for Java完成複雜Word與PDF的匯出
阿新 • • 發佈:2019-02-10
使用Aspose.Words for Java 可以匯出複雜WORD PDF HTML 多種資料格式
官方下載地址:http://www.aspose.com/java/word-component.aspx
第二部寫一個具體的實現類
Java程式碼
!!!因為Aspose.Words for Java不支援HashMap的資料格式,需要我們自己實現
好在它提供了IMailMergeDataSource介面
Java程式碼
這樣我們就把資料填充好了。接下來就是匯出了
Java程式碼
官方下載地址:http://www.aspose.com/java/word-component.aspx
我所用的版本是Aspose.Words.jdk16.jar
先看效果圖
1-對資料行的匯出,分別是PDF與WORD格式
[size=large]
使用該元件一共分為4個步驟
1-定義模板
2-載入模板
3-填充資料
4-設定匯出格式並匯出
接下來我們按照以上4個步驟進行報表的匯出
首先定義模板(可以再附件中下載)這裡只介紹最後一個個人簡歷的模板
一個普通的自定義word就可以
«TableStart:Employees»
«TableEnd:Employees»
這一對標記代表一個數據單元 Employees 是可以自定義的 填充資料來源時要對應上
其他的就好理解了 比如«FirstName» 就是資料來源中的屬性
接下來開始我們的匯出之旅吧!!!!
第一步定義一個匯出的抽象類
- package com.epkj.words;
- import org.springframework.stereotype.Component;
- import com.aspose.words.Document;
- @Component("ProcessWord")
-
public abstract
- public abstract Document execute(String templatePath) throws Exception;
- }
第二部寫一個具體的實現類
Java程式碼
- package com.epkj.words;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.HashMap;
-
import java.util.List;
- import java.util.Map;
- import org.springframework.stereotype.Component;
- import com.aspose.words.Document;
- /**
- * 帶圖片的匯出
- */
- @Component("EmployeesReportDemo")
- public class EmployeesReportDemo extends ProcessWord {
- @Override
- public Document execute(String templatePath) throws Exception {
- //1 讀取模板
- Document doc = new Document(templatePath + "/" + "EmployeesReportDemo.doc");
- String imagePath = templatePath + "/" + "employees.jpg";
- //2 填充資料來源
- doc.getMailMerge().executeWithRegions(new MapMailMergeDataSource(getMapList(imagePath), "Employees"));
- return doc;
- }
- private List<Map<String, Object>> getMapList(String imagePath) throws IOException {
- List<Map<String, Object>> dataList = new ArrayList<Map<String,Object>>();
- //讀取一個二進位制圖片
- FileInputStream fis = new FileInputStream(imagePath);
- byte[] image = new byte[fis.available()];
- fis.read(image);
- fis.close();
- for (int i = 0; i < 20; i++) {
- Map<String, Object> record = new HashMap<String, Object>();
- //這裡的key要與模板中的<<xxxxx>>對應
- record.put("FirstName", "歐陽");
- record.put("LastName", "夏丹");
- record.put("Title", "個人簡歷匯出Word PDF");
- record.put("Address", "中國 北京市 東城區");
- record.put("City", "北京");
- record.put("Country", "遼寧瀋陽");
- //二進位制資料
- record.put("PhotoBLOB", image);
- dataList.add(record);
- }
- return dataList;
- }
- }
!!!因為Aspose.Words for Java不支援HashMap的資料格式,需要我們自己實現
好在它提供了IMailMergeDataSource介面
Java程式碼
- package com.epkj.words;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map;
- import com.aspose.words.IMailMergeDataSource;
- /**
- * 實現對HashMap的支援
- */
- public class MapMailMergeDataSource implements IMailMergeDataSource {
- private List<Map<String, Object>> dataList;
- private int index;
- //word模板中的«TableStart:tableName»«TableEnd:tableName»對應
- private String tableName = null;
- /**
- * @param dataList 資料集
- * @param tableName 與模板中的Name對應
- */
- public MapMailMergeDataSource(List<Map<String, Object>> dataList, String tableName) {
- this.dataList = dataList;
- this.tableName = tableName;
- index = -1;
- }
- /**
- * @param data 單個數據集
- * @param tableName 與模板中的Name對應
- */
- public MapMailMergeDataSource(Map<String, Object> data, String tableName) {
- if(this.dataList == null) {
- this.dataList = new ArrayList<Map<String,Object>>();
- this.dataList.add(data);
- }
- this.tableName = tableName;
- index = -1;
- }
- /**
- * 獲取結果集總數
- * @return
- */
- private int getCount() {
- return this.dataList.size();
- }
- @Override
- public IMailMergeDataSource getChildDataSource(String arg0)
- throws Exception {
- return null;
- }
- @Override
- public String getTableName() throws Exception {
- return this.tableName;
- }
- /**
- * 實現介面
- * 獲取當前index指向資料行的資料
- * 將資料存入args陣列中即可
- * @return ***返回false則不繫結資料***
- */
- @Override
- public boolean getValue(String key, Object[] args) throws Exception {
- if(index < 0 || index >= this.getCount()) {
- return false;
- }
- if(args != null && args.length > 0) {
- args[0] = this.dataList.get(index).get(key);
- return true;
- } else {
- return false;
- }
- }
- /**
- * 實現介面
- * 判斷是否還有下一條記錄
- */
- @Override
- public boolean moveNext() throws Exception {
- index += 1;
- if(index >= this.getCount())
- {
- return false;
- }
- return true;
- }
- }
這樣我們就把資料填充好了。接下來就是匯出了
Java程式碼
- package com.epkj.words;
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.context.WebApplicationContext;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- import com.aspose.words.Document;
- import com.aspose.words.SaveFormat;
- /**
- * 所有匯出功能由該類完成
- */
- @Controller
- @RequestMapping("/DemoBaseController.do")
- public class DemoBaseController {
- @RequestMapping(params =