java 利用freemaker模板 匯出word,包含動態資料,圖片
在工作中又遇到要匯出word,根據模板匯出,裡面有一部分內容資料事動態的,需要迴圈根據資料匯出。
一、首先準備word模板
1、在word裡面講格式調整好,在需要匯出圖片的地方填充圖片。
需要填充資料的地方用欄位名代替。以便於修改為el表示式,也可以直接在模板裡面直接用EL表示式,定義好,比如這樣:
2、另存為 型別為 word 2003 xml
3、將xml檔案開啟,可以看到已經是xml格式了。可以將內容全部複製到xml格式化網站,進行格式化之後,這樣就好看多了嘛
4、然後將檔案複製到你專案,改檔案字尾為ftl
二、準備匯出資料
1、首先在專案裡面引入freemaker依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.6.1</version>
</dependency>
2、準備要匯出的資料結構,這裡只展示幾個欄位
@Data
public class RecordExportTO implements Serializable { private String title; private String feedbackName; private String feedbackPhone; private String diagnosisNo; private List<StTemplateQuestion> questionsList;//動態資料內容 private String faultImg; private List<ExportWordImgVo> faultImgList;//圖片集合 }
3、修改模板,根據資料結構欄位,將需要填充資料的地方,修改為EL表示式。${()!} 加括號!號表示可以為null
動態資料內容部分,根據你需要動態輸出的,部分進行迴圈,我這裡是表格一行迴圈。
在迴圈裡面,根據自己的業務處理
圖片處理:
三、匯出
我是介面http匯出
@Autowired
private Configuration configuration; //freemarker.template.Configuration;
@GetMapping("/export/{id}")
public void exportById(@PathVariable Integer id,HttpServletResponse response) {
RecordExportTO data =new RecordExportTO();
//準備資料部分,省略--
//圖片 List<ExportWordImgVo> faultImgList = findXls(record.getFaultImg(),xls);//這裡這個函式是我得業務邏輯處理,返回的是多張圖片的base64編碼 data.setFaultImgList(faultImgList);
//匯出 configuration.setDefaultEncoding("utf-8");
try { response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(record.getDiagnosisNo().getBytes("utf-8"), "iso8859-1") + ".doc\"");//匯出word檔名
response.setCharacterEncoding("utf-8"); final Template template = configuration.getTemplate("word/record.ftl", "utf-8");//模板位置
template.process(data, new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "utf-8")));
} catch (Exception e) {
log.error("匯出失敗", e);
}finally {
try {
response.getOutputStream().close();
} catch (IOException e) { e.printStackTrace(); }
}
}
//根據url返回圖片的base64編碼 private String getImgBase64(String url){ HttpClient client = HttpClients.custom().build(); HttpGet get = new HttpGet(url); HttpResponse response; try { response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { // 得到實體 HttpEntity entity = response.getEntity(); byte[] data = EntityUtils.toByteArray(entity); return new String(Base64.encodeBase64(data)); } else { logger.error("下載檔案url 錯誤返回:{}",response); return null; } } catch (IOException e) { e.printStackTrace(); logger.error("下載檔案url 錯誤:",e); } return null; }
//圖片class
public class ExportWordImgVo implements Serializable {
private String id;//自定義id
private String name;//圖片名
private String content;//圖片base64碼
}
訪問這個介面,就可以匯出啦