場景: 後臺給定一個標準文件模板, 在頁面填寫表單保存後, 根據內容填充模板生成一個文件, 然後將其上傳.
因爲上傳功能涉及到一個文件夾配置等, 公司裏面已經封裝好一套工具, 需要給定一個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();
}
}