700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Freemarker生成word:导出多张图片list 同时导出文字+图片的list

Freemarker生成word:导出多张图片list 同时导出文字+图片的list

时间:2021-01-04 18:54:12

相关推荐

Freemarker生成word:导出多张图片list 同时导出文字+图片的list

实现效果

功能需求

要求照片部分,展示多张图片要求分析部分,一行文字加一张图片作为分析内容,并且可以展示多个分析结果要求比对部分,一行文字加两张对比图片展示,且展示多组比对结果

代码

实体类

// Test实体类,Set、Get略public class Test {private String date;private String site;private String param;private List<String> picture;private String measure;private List<AnalysisDto> analysisList;private List<CompareDto> compareDtoList;private String staff;}// 将分析部分的属性,作为一个实体类,Set、Get略public class AnalysisDto {private String analysis;private String analysisImg;public AnalysisDto(String analysis, String analysisImg) {this.analysis = analysis;this.analysisImg = analysisImg;}}// 比对部分的实体类,Set、Get略public class CompareDto {private String analysis;private String modePicture;private String resultPicture;public CompareDto(String analysis, String modePicture, String resultPicture) {this.analysis = analysis;this.modePicture = modePicture;this.resultPicture = resultPicture;}}

导出接口

public AjaxResult export(HttpServletRequest request, HttpServletResponse response) throws Exception {Test test = new Test();test.setDate("-06-10");test.setSite("厦门");test.setParam("模板测试");test.setPicture(Arrays.asList(FileUtils.encodeBase64File("whale.jpg"), FileUtils.encodeBase64File("whale2.jpg")));test.setMeasure("IDEA");test.setAnalysisList((new ArrayList<AnalysisDto>() {{add(new AnalysisDto("aaa", FileUtils.encodeBase64File("whale.jpg")));add(new AnalysisDto("bbb", FileUtils.encodeBase64File("whale1.jpg")));}}));test.setCompareDtoList(new ArrayList<CompareDto>() {{add(new CompareDto("ccc", FileUtils.encodeBase64File("whale.jpg"), FileUtils.encodeBase64File("猫耳.jpg")));add(new CompareDto("ddd", FileUtils.encodeBase64File("whale1.jpg"), FileUtils.encodeBase64File("whale2.jpg")));}});test.setStaff("测试人员");DocumentUtils documentUtils = new DocumentUtils();// 调用文件类里的模板导入方法documentUtils.exportTestWord(test,request,response).getInputStream();return AjaxResult.success();}

将数据导入巡检报告模板

/*** @author Ava* @date /6/10 11:08*/public class DocumentUtils {/*** 默认上传的地址*/public static String getDefaultBaseDir() {return "D:/uploadPath";}/*** 模板文件路径*/public static String getFileDirectory(){return "D:/uploadPath/template";}// 数据导入模板方法public InputStreamSource exportTestWord(Test test, HttpServletRequest request, HttpServletResponse response) throws Exception{// 纠正编码request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("utf-8");// ** 初始化配置文件**//*Configuration configuration = new Configuration();// ** 设置编码 **//*configuration.setDefaultEncoding("utf-8");// ** ftl文件的路径**//// 加载模板文件configuration.setDirectoryForTemplateLoading(new File(getFileDirectory()));// 加载模板,通过Word转XML文件转换过来的Template template = null;template = configuration.getTemplate("test.ftl");// 准备数据Map<String, Object> data = data(test);// 指定输出word文件的路径,调用createDoc方法生成Word文档InputStreamSource file = createDoc(data, template);InputStream fin = file.getInputStream();File file1 = new File(new File(getDefaultBaseDir()), "test.doc");inputStreamToFile(fin, file1);return file;}/*** 创建word文件** @param dataMap* @param template* @return* @throws IOException*/public static InputStreamSource createDoc(Map<String, Object> dataMap, Template template)throws IOException, TemplateException {//生成随机的文件名称StringWriter out1 = new StringWriter();Writer out = new BufferedWriter(out1, 10240);//将数据输出到模板template.process(dataMap, out);out.close();out1.close();return new ByteArrayResource(out1.toString().getBytes(StandardCharsets.UTF_8));}public static void inputStreamToFile(InputStream ins, File file) {try {OutputStream os = new FileOutputStream(file);int bytesRead = 0;byte[] buffer = new byte[8192];while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {os.write(buffer, 0, bytesRead);}os.close();ins.close();} catch (Exception e) {e.printStackTrace();}}public static Map<String, Object> data(Test test) {Map<String, Object> dataMap = new HashMap<>();dataMap.put("Test", test);return dataMap;}}

模板制作

xml

用office打开word,并插入文字和图片占位,另存为Word XML文档格式

ftl

用IDE打开xml文件,格式化文件后修改内容。

1.出现占位被分隔的情况的话,将中间的文字删除
2.将图片转码删除,改为占位符(单图片的情况直接改为占位符,多图片循环改为其他,详情见下)

3.将${property)替换为${Test.property},这里的Test为传入的Map的key。
4. 循环部分模板修改

单图片循环

图片带文字循环

文字带双图片循环同理

5. 修改完成后,将xml文件的后缀名改为ftl,保存到代码里写明的文件路径下。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。