模板


生成效果

实现代码

官方文档
引入word依赖

<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.3</version></dependency>

数据准备

Map<String, Object> dataObj = new HashMap<>();// 水质折线图if (wqDataMap != null && !wqDataMap.isEmpty()) {Set<Long> keySet = wqDataMap.keySet();if (keySet != null && keySet.size() > 0) {int index = 0;String wqTitle = "";// 区块对List<Map<String, Object>> wqSections = new ArrayList<Map<String, Object>>();// totalWqCod totalWqNhnChartMultiSeriesRenderData totalCodLine = new ChartMultiSeriesRenderData();totalCodLine.setChartTitle("cod");ChartMultiSeriesRenderData totalNhnLine = new ChartMultiSeriesRenderData();totalNhnLine.setChartTitle("nhn");List<SeriesRenderData> codSeriesRenderDatas = new ArrayList<SeriesRenderData>();List<SeriesRenderData> nhnSeriesRenderDatas = new ArrayList<SeriesRenderData>();for (Long sid : keySet) {Map<String, Object> data = new HashMap<String, Object>();index++;wqTitle = stationMap.get(sid);List<StandardWaterQualityVo> wqlist = wqDataMap.get(sid);ArrayList<String> timeList = new ArrayList<String>();ArrayList<Double> nhnList = new ArrayList<Double>();ArrayList<Double> codList = new ArrayList<Double>();for (StandardWaterQualityVo vo : wqlist) {timeList.add(sdf.format(vo.getCollectTime()));nhnList.add(vo.getNhn());codList.add(Double.valueOf(String.valueOf(vo.getCod())));}// 总图if (index == 1 || timeList.size() > wqTimeListSize) {totalCodLine.setCategories(timeList.toArray(new String[wqTimeListSize]));// 类别totalNhnLine.setCategories(timeList.toArray(new String[wqTimeListSize]));// 类别}codSeriesRenderDatas.add(new SeriesRenderData(wqTitle, codList.toArray(new Double[wqTimeListSize])));nhnSeriesRenderDatas.add(new SeriesRenderData(wqTitle, nhnList.toArray(new Double[wqTimeListSize])));// 分图ChartMultiSeriesRenderData codLine = new ChartMultiSeriesRenderData();codLine.setChartTitle(wqTitle + "cod");codLine.setCategories(timeList.toArray(new String[timeList.size()]));// 类别List<SeriesRenderData> seriesRenderDatas1 = new ArrayList<SeriesRenderData>();seriesRenderDatas1.add(new SeriesRenderData("cod", codList.toArray(new Double[codList.size()])));codLine.setSeriesDatas(seriesRenderDatas1);ChartMultiSeriesRenderData nhnLine = new ChartMultiSeriesRenderData();nhnLine.setChartTitle(wqTitle + "nhn");nhnLine.setCategories(timeList.toArray(new String[timeList.size()]));// 类别List<SeriesRenderData> seriesRenderDatas2 = new ArrayList<SeriesRenderData>();seriesRenderDatas2.add(new SeriesRenderData("nhn", nhnList.toArray(new Double[nhnList.size()])));nhnLine.setSeriesDatas(seriesRenderDatas2);data.put("wqCod", codLine);data.put("wqNhn", nhnLine);data.put("wqTitle", "1." + index + "." + wqTitle);wqSections.add(data);}totalCodLine.setSeriesDatas(codSeriesRenderDatas);totalNhnLine.setSeriesDatas(nhnSeriesRenderDatas);dataObj.put("wqTimeStr", wqTimeStr);dataObj.put("wqSections", wqSections);dataObj.put("totalWqNhn", totalNhnLine);dataObj.put("totalWqCod", totalCodLine);}}// 污水图像识别if (monitorDataMap != null && !monitorDataMap.isEmpty()) {Set<Long> mKeySet = monitorDataMap.keySet();if (mKeySet != null && mKeySet.size() > 0) {int mIndex = 0;String monitorTitle = "";// 区块对List<Map<String, Object>> monitorSections = new ArrayList<Map<String, Object>>();for (Long mId : mKeySet) {Map<String, Object> data = new HashMap<String, Object>();List<Map<String, Object>> monitorPhotoSections = new ArrayList<Map<String, Object>>();List<RecordDatasVo> monitorList = monitorDataMap.get(mId);mIndex++;monitorTitle = stationMap.get(mId);if (monitorList != null && monitorList.size() > 0) {for (RecordDatasVo vo : monitorList) {String propName = vo.getPropName();String propValue = vo.getPropValue();if (propName.equals("photo")) {try {Map<String, Object> data0 = new HashMap<String, Object>();Date collectTime = vo.getCollectTime();// 获取图片String bucket = minioProperties.getBucketName();String dir = propValue;if (dir.length() > 0 && dir.startsWith("/")) {dir = dir.substring(1);log.info(dir);}S3Object object = minioTemplate.getObject(bucket, dir);// minioTemplate.getSingleObjectStream(bucket, dir, fileInputStream);// data0.put("monitorPhoto", Pictures.ofStream(new FileInputStream("temp" +// propValue))// .size(528, 297).create());data0.put("monitorPhoto",Pictures.ofStream(object.getObjectContent()).size(528, 297).create());monitorPhotoSections.add(data0);} catch (Exception e) {// TODO Auto-generated catch blocklog.info("@monitorPhotoError:" + propValue + "{}", e);e.printStackTrace();}}}data.put("monitorTitle", "2." + mIndex + "." + monitorTitle);data.put("monitorPhotoSections", monitorPhotoSections);monitorSections.add(data);}}dataObj.put("monitorSections", monitorSections);}

导出

String path = "";// 第一种:获取类加载的根路径path = this.getClass().getResource("/").getPath();System.out.println(path);XWPFTemplate template = XWPFTemplate.compile(path + "temp\\template.docx").render(dataObj);FileOutputStream out;try {out = new FileOutputStream("I:/template0.docx");template.write(out);response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + new SimpleDateFormat("yyyyMMddHHmm").format(new Date()) + ".docx");response.setContentType("application/octet-stream;charset=utf-8");OutputStream ouputStream = response.getOutputStream();template.write(ouputStream);ouputStream.flush();ouputStream.close();template.close();

踩坑

  1. 生成图表只出现打印地址
    如:com.deepoove.poi.data.ChartMultiSeriesRenderData.对象地址
    解决:图表为引用标签,需要在模板文件中提前插入图表并且设置 可替换文字为{{String}}格式的引用标签即可
  2. 生成图片不显示没效果
    控制台打印以下信息:The data [null] of the template {{@monitorPhoto}} is illegal, will apply

解决:
模板文档中图表标签要以@开头作为标识,但代码中组织数据结构是不需要加@符,只需要后面的文字 标识

  1. 多系列图表中categories和seriesDatas子集数组长度需要一致否则会报错
    错误信息:TemplateRenderPolicy render error
    Category and values must have the same point count.

  2. 模板文档中部分标题文字的自定义的格式,可能会使生成的文档格式错乱。列表标题或是自动生成目录都可能存在格式错乱。建议{{标签}}暂时先别使用格式,效果实现后再添加word格式。

  3. 区块对标签:{{?sections}}{{/sections}},存在多重循环时数据可以嵌套叠加使用

poi-tl生成word多张图表及图片相关推荐

  1. Java使用FreeMarker自动生成Word文档(带图片和表单)

    Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...

  2. poi生成word文档,插入图片,echar报表生成到word,word表格

    poi生成word文档,word表格,将echar报表生成到word 项目中用到生成word报表,报表中有表格的合并 .页眉.表格中会有报表图片.然后查找了网上的资料,利用echar生成柱状图,然后已 ...

  3. freemarker+Jfreechart生成Word文档(含图片)

    这几天再弄一个报表,要统计一些信息最终的部分展示结果如下: 基本工具freemarker,jfreechart 工程的部分结构如下 与生成Word有关的类主要有FreemarkerConfigurat ...

  4. 用Aspose.Words for .NET动态生成word文档中的图片或水印

    1.概述 在项目中生成word文档,这个功能很普遍的,一般生成都是纯文字或是列表的比较多,便于客户打印,而要把图片也生成到word文档中的需求有些客户也是需要的,例如产品图片.这次我们介绍的是如何利用 ...

  5. Java poi实现合并word文档,兼容图片合并(java实现word导出)

    需求,今天有个需求,实现word文档批量导出,并附带图片,这里的批量导出是指导出一份word文档存在多分相同类型的数据. 实现方式,定义一份word文档模板,使用占位符方式来替换文本内容. 问题,怎么 ...

  6. java 生成 word文档 导出附带图片 已实现

    思路: 利用模板来实现. 第一步:新建一个word,需要替换的内容用${replace}来做标记,图片的话直接将需要附带上的图先贴上去, 第二步: 然后保存为xml类型文件, 然后编辑器打开, 然后将 ...

  7. java根据模板生成word 带图,xml模板图片注意标签处理

    循环给word插入图片 <#if image??>       <#list image as bean>       <w:p>         <w:pP ...

  8. POI生成word文档完整案例及讲解

    一,网上的API讲解 其实POI的生成Word文档的规则就是先把获取到的数据转成xml格式的数据,然后通过xpath解析表单式的应用取值,判断等等,然后在把取到的值放到word文档中,最后在输出来. ...

  9. java 导出word 乱码问题,如何解决POI生成WORD中文乱码问题?

    需求:因为系统用户需要把合同,产品,证书导出WORD. 设计:写好合同,产品,证书的模板,然后读取模板,写入WORD,最后弹出窗口让用户保存. 我写了二个方法,但是感觉方法一对以后的表单问题不能解决, ...

最新文章

  1. SpringCloud服务组合
  2. Server Application Unavailable
  3. Linux之后台运行(nohup和)
  4. SDL及扩展库在ARM-Linux 完整移植
  5. 阿里巴巴java开发手册学习
  6. 获得2007年度的ISA-SERVER MVP
  7. 【经验贴】smartCarers在比赛后如何获取更好的发展
  8. ssh 端口_【科普】SSH都不懂,还搞什么网络
  9. POJ 1276 ATM凑钱(动态规划)(未解答)
  10. 带你全面的了解二叉树
  11. Android中插件开发篇之----类加载器
  12. POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)
  13. CHROME 拖动安装插件报错CRX_HEADER_INVALID的解决办法
  14. jquery name选择器_【百战程序员从开始到植发】之jquery
  15. 计算机组成原理(LogisimVerilog部分)-笔记
  16. 基于fpga+stm32的数字示波器
  17. VS2015使用教程(使用VS2015编写C语言程序)
  18. android开发点击版本号多次无法进入开发者模式模式
  19. 【PTA】中M22春C、Java入门练习7-138 质因子分解
  20. Docker修改默认网段

热门文章

  1. 845计算机系统考试科目,2020年浙江工商大学硕士研究生入学考试845计算机基础综合科目大纲...
  2. 鸿蒙手机有没有carplay车载功能,carplay有哪些功能?苹果carplay车载系统功能介绍...
  3. Creo螺旋扫描、方程曲线
  4. CG动画制作项目第八篇:mentalray的渲染方式
  5. 韩语韵尾(收音)在粤语、日语、英语中相应的发音
  6. 注意力机制 - 注意力提示
  7. Matlab 绘图坐标轴设置,字体,字号等
  8. OSChina 周二乱弹 —— 举杯邀明月,对狗成三人
  9. 描述 Web 服务:WSDL
  10. 用易语言做聊天软件的第一天