1. 程式人生 > 其它 >java 利用freemaker模板 匯出word,包含動態資料,圖片

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碼
}

    

    訪問這個介面,就可以匯出啦