使用freemarker填充模板生成文件並進行上傳

場景: 後臺給定一個標準文件模板, 在頁面填寫表單保存後, 根據內容填充模板生成一個文件, 然後將其上傳.

因爲上傳功能涉及到一個文件夾配置等, 公司裏面已經封裝好一套工具, 需要給定一個File對象或者輸入流對象和一些關聯信息,調用方法即可. 所以這裏有三個步驟 1.填充文件 2.生成一個臨時文件 3.調用上傳

第二步可以放一個固定文件, 每次填充都寫到這個文件. 但這個如果有併發操作的話就會出現問題, 所以此處採用每次都生成一個臨時文件,所有步驟完成後把臨時文件刪除. 下面上代碼

private void buildAndUploadDoc(AuditSiteSurvey survey) throws IOException {
		Cost cost = costService.get(survey.getTaskId());
		String fileName = "test填充文檔.doc";
		if(cost != null){
			fileName = cost.getName() + fileName;
		}
		Map<String, Object> templateParams = new HashMap<>();
		templateParams.put("cost", cost);
		templateParams.put("ass", survey);
		templateParams.put("curDate", DateUtil.formatYMD(new Date()));
        String strPath = SysVariable.get("SAVE_FILE_ROOT") + "/AuditSiteSurveyTemp";
        String tempFileName = "test填充文檔" + System.currentTimeMillis()+".doc";
		File file = new File(strPath, tempFileName);//填充好的臨時文件
		if (!file.exists()) {   //文件不存在則創建文件,先創建目錄
			File dir = new File(file.getParent());
			dir.mkdirs();
			file.createNewFile();
		}
		try(Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))){
		    ExportWordUtils.mxl2Word("KCJLB.xml", out, templateParams);
		    FileUploadForm uploadForm = new FileUploadForm();
		    uploadForm.setUploadFileName(fileName);
		    uploadForm.setUpload(file);
		    uploadForm.setRefRecordId(survey.getId());
		    uploadForm.setRefModule("AuditSiteSurvey");
            fileService.upload(uploadForm); //封裝好的上傳文件方法
		    
        }finally{
            file.delete();//刪除緩存文件,要注意的是涉及到這個臨時文件的流都記得關閉纔能有效刪除
        }
}

下面附上ExportWordUtils的填充內容的方法

public static void mxl2Word(Path directory,String filename,Writer writer,Map<String, Object> map) throws IOException {
		Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
		configuration.setDefaultEncoding("UTF-8"); 
		configuration.setDirectoryForTemplateLoading(directory.toFile());

		Template template=configuration.getTemplate(filename);

		try {
			template.process(map, writer);
		} catch (TemplateException e) {
			e.printStackTrace();
		}
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章