使用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();
		}
	}
发布了53 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40085888/article/details/89914246
今日推荐