1.官方文档 Poi-tl Documentation

word 模板 准备 .docx 文件

再准备一张图片 一起放到项目的resources目录下

impl层 第一个word文档,第二第三个与第一个相差不大

 

官网中文本设置样式

传入图片

 controller层

代码:

引入依赖,注意版本冲突

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version>
</dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0</version>
</dependency>

Controller 层代码

package com.example.demo.controller;import com.deepoove.poi.util.PoitlIOUtils;
import com.deepoove.poi.xwpf.NiceXWPFDocument;
import com.example.demo.contain.CommonConstant;
import com.example.demo.service.FileServcie;
import com.example.demo.service.LogReportService;
import com.example.demo.util.Base64Utile;
import com.example.demo.util.FileDeleteUtile;
import fr.opensagres.xdocreport.core.XDocReportException;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;@RestController
@RequestMapping(value = "/local5")
public class LogController {@Resourceprivate LogReportService logReportService;@Resourceprivate FileServcie fileServcie;@GetMappingpublic void exportWord1(HttpServletResponse response) throws IOException, XDocReportException, Exception {String path1 = this.getClass().getClassLoader().getResource("2020101814395601.png").getPath();String imgBase = Base64Utile.getImgBase(path1);//日志数量统计logReportService.opLogDocx(imgBase,response);//系统日志统计logReportService.systemLogResDocx(imgBase,response);//监控日志统计logReportService.monitorLogResLogDocx(imgBase,response);//系统日志访问用户top10统计logReportService.loginDocx(imgBase,response);String oplogPath =fileServcie.docxPath()+ CommonConstant.SEPARATOR +"oplog.docx";String systemLogResPath =fileServcie.docxPath()+ CommonConstant.SEPARATOR +"systemLogRes.docx";String monitorLogResPath =fileServcie.docxPath()+ CommonConstant.SEPARATOR +"monitorLogRes.docx";String loginPath =fileServcie.docxPath()+ CommonConstant.SEPARATOR +"login.docx";NiceXWPFDocument oplog = new NiceXWPFDocument(new FileInputStream(oplogPath));NiceXWPFDocument systemLogRes = new NiceXWPFDocument(new FileInputStream(systemLogResPath));NiceXWPFDocument monitorLogRes = new NiceXWPFDocument(new FileInputStream(monitorLogResPath));NiceXWPFDocument login = new NiceXWPFDocument(new FileInputStream(loginPath));//设置内容不合并XWPFParagraph paragraph = oplog.createParagraph();paragraph.setPageBreak(true);XWPFParagraph paragraph1 = systemLogRes.createParagraph();paragraph1.setPageBreak(true);XWPFParagraph paragraph2 = monitorLogRes.createParagraph();paragraph2.setPageBreak(true);//开始合并文件NiceXWPFDocument merge = oplog.merge(systemLogRes).merge(monitorLogRes).merge(login);//日志文件名Date date = new Date();SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String format = ft.format(date);String[] split = format.split(" ");String[] time = split[0].split("-");String[] timeDate = split[1].split(":");String fileName ="日志报表-" + time[0]+time[1]+time[2]+timeDate[0]+timeDate[1]+timeDate[2]+ ".docx";//生成临时文件存放地址String temDir=fileServcie.docxPath();FileOutputStream fos = new FileOutputStream(temDir+ CommonConstant.SEPARATOR +fileName);merge.write(fos);String path = fileServcie.docxPath()+CommonConstant.SEPARATOR+fileName;fileServcie.handleDownloadFile(path, response, fileName);PoitlIOUtils.closeQuietlyMulti(merge,oplog,systemLogRes,monitorLogRes,login, fos);FileDeleteUtile.deleteFile(new File(fileServcie.docxPath()));}}

Service

package com.example.demo.service;import fr.opensagres.xdocreport.core.XDocReportException;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public interface LogReportService {/*** 系统日志统计* @param response* @throws IOException* @throws XDocReportException*/void systemLogResDocx(String base64,HttpServletResponse response)throws IOException, XDocReportException;/*** 监控日志统计* @param response* @throws IOException* @throws XDocReportException*/void monitorLogResLogDocx(String base64,HttpServletResponse response)throws IOException, XDocReportException;/***日志数量统计* @param response* @throws IOException* @throws XDocReportException*/void opLogDocx(String base64,HttpServletResponse response)throws IOException, XDocReportException;/***系统日志访问用户top10统计* @param response* @throws IOException* @throws XDocReportException*/void loginDocx(String base64,HttpServletResponse response)throws IOException, XDocReportException;
}

impl

package com.example.demo.impl;import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.*;
import com.deepoove.poi.util.PoitlIOUtils;
import com.example.demo.contain.CommonConstant;
import com.example.demo.service.FileServcie;
import com.example.demo.service.LogReportService;
import fr.opensagres.xdocreport.core.XDocReportException;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Service
public class LogReportServiceImpl implements LogReportService {@Resourceprivate FileServcie fileServcie;@Overridepublic void opLogDocx(String base64,HttpServletResponse response) throws IOException, XDocReportException {//创建XWPFTemplate对象,并设置读取模板路径和要渲染的数据String path = this.getClass().getClassLoader().getResource("报表公用模板.docx").getPath();String filePath = URLDecoder.decode(path, "UTF-8");//如果路径中带有中文会被URLEncoder,因此这里需要解码//目前图片在resource目录下String path1 = this.getClass().getClassLoader().getResource("2020101814395601.png").getPath();//主题HashMap<String, Object> theme = new HashMap<String, Object>() {{put("theme",Texts.of("日志报表").fontSize(22).bold().create());}};//标题HashMap<String, Object> title = new HashMap<String, Object>() {{put("title",Texts.of("1.日志数量统计").fontSize(12).bold().create());}};//图片HashMap<String, Object> value = new HashMap<String, Object>() {{put("value", Pictures.ofBase64(base64, PictureType.PNG).center().create());}};//表格HashMap<String, Object> table = new HashMap<String, Object>() {{// 第0行居中且背景为蓝色的表格RowRenderData row0 = Rows.of("序号", "日期", "系统日志", "监控日志", "主机日志").center().create();put("table", Tables.create(row0));String id;//结果集List<RowRenderData> renderDataList = new ArrayList<>();renderDataList.add(row0);for (int i = 0; i < 56; i++) {id = String.valueOf(i+1);RowRenderData rowi = Rows.create(id, "2022", "100", "150", null);renderDataList.add(rowi);}//list转数组RowRenderData[] rowRenderDatas = renderDataList.toArray(new RowRenderData[renderDataList.size()]);put("table", Tables.create(rowRenderDatas));}};List<Map<String,Object>> listMap = new ArrayList<>();listMap.add(theme);listMap.add(title);listMap.add(value);listMap.add(table);Map<String,Object> map = new HashMap<>();map.put("sections",listMap);XWPFTemplate template = XWPFTemplate.compile(filePath).render(map);//=================生成文件保存在本地文件目录下=================//生成临时文件存放地址String temDir=fileServcie.docxPath();//文件名  带后缀String fileName = "oplog.docx";FileOutputStream fos = new FileOutputStream(temDir+ CommonConstant.SEPARATOR +fileName);template.write(fos);PoitlIOUtils.closeQuietlyMulti(template, fos);}@Overridepublic void systemLogResDocx(String base64,HttpServletResponse response) throws IOException, XDocReportException {//创建XWPFTemplate对象,并设置读取模板路径和要渲染的数据String path = this.getClass().getClassLoader().getResource("报表公用模板.docx").getPath();String filePath = URLDecoder.decode(path, "UTF-8");//如果路径中带有中文会被URLEncoder,因此这里需要解码//目前图片在resource目录下String path1 = this.getClass().getClassLoader().getResource("2020101814395601.png").getPath();//标题HashMap<String, Object> title = new HashMap<String, Object>() {{put("title",Texts.of("2.系统日志操作结果统计").fontSize(12).bold().create());}};//图片HashMap<String, Object> value = new HashMap<String, Object>() {{put("value", Pictures.ofBase64(base64, PictureType.PNG).center().create());}};//表格HashMap<String, Object> table = new HashMap<String, Object>() {{// 第0行居中且背景为蓝色的表格RowRenderData row0 = Rows.of("序号", "日期", "成功", "失败", "异常", "成功率%").center().create();put("table", Tables.create(row0));String id;//结果集List<RowRenderData> renderDataList = new ArrayList<>();renderDataList.add(row0);for (int i = 0; i < 6; i++) {id = String.valueOf(i+1);RowRenderData rowi = Rows.create(id, "2022", "是", null,null, "100%");renderDataList.add(rowi);}//list转数组RowRenderData[] rowRenderDatas = renderDataList.toArray(new RowRenderData[renderDataList.size()]);put("table", Tables.create(rowRenderDatas));}};List<Map<String,Object>> listMap = new ArrayList<>();
//        listMap.add(theme);listMap.add(title);listMap.add(value);listMap.add(table);Map<String,Object> map = new HashMap<>();map.put("sections",listMap);XWPFTemplate template = XWPFTemplate.compile(filePath).render(map);//=================生成文件保存在本地文件目录下=================//生成临时文件存放地址String temDir=fileServcie.docxPath();//文件名  带后缀String fileName = "systemLogRes.docx";FileOutputStream fos = new FileOutputStream(temDir+ CommonConstant.SEPARATOR +fileName);template.write(fos);PoitlIOUtils.closeQuietlyMulti(template, fos);}@Overridepublic void monitorLogResLogDocx(String base64,HttpServletResponse response) throws IOException, XDocReportException {//创建XWPFTemplate对象,并设置读取模板路径和要渲染的数据String path = this.getClass().getClassLoader().getResource("报表公用模板.docx").getPath();String filePath = URLDecoder.decode(path, "UTF-8");//如果路径中带有中文会被URLEncoder,因此这里需要解码//目前图片在resource目录下String path1 = this.getClass().getClassLoader().getResource("2020101814395601.png").getPath();//标题HashMap<String, Object> title = new HashMap<String, Object>() {{put("title",Texts.of("3.监控日志操作结果统计").fontSize(12).bold().create());}};//图片HashMap<String, Object> value = new HashMap<String, Object>() {{put("value", Pictures.ofBase64(base64, PictureType.PNG).center().create());}};//表格HashMap<String, Object> table = new HashMap<String, Object>() {{// 第0行居中且背景为蓝色的表格RowRenderData row0 = Rows.of("序号", "日期", "成功", "失败", "异常", "成功率%").center().create();put("table", Tables.create(row0));String id;//结果集List<RowRenderData> renderDataList = new ArrayList<>();renderDataList.add(row0);for (int i = 0; i < 6; i++) {id = String.valueOf(i+1);RowRenderData rowi = Rows.create(id, "2022", "是", null,null, "100%");renderDataList.add(rowi);}//list转数组RowRenderData[] rowRenderDatas = renderDataList.toArray(new RowRenderData[renderDataList.size()]);put("table", Tables.create(rowRenderDatas));}};List<Map<String,Object>> listMap = new ArrayList<>();
//        listMap.add(theme);listMap.add(title);listMap.add(value);listMap.add(table);Map<String,Object> map = new HashMap<>();map.put("sections",listMap);XWPFTemplate template = XWPFTemplate.compile(filePath).render(map);//=================生成文件保存在本地文件目录下=================//生成临时文件存放地址String temDir=fileServcie.docxPath();//文件名  带后缀String fileName = "monitorLogRes.docx";FileOutputStream fos = new FileOutputStream(temDir+ CommonConstant.SEPARATOR +fileName);template.write(fos);PoitlIOUtils.closeQuietlyMulti(template, fos);}@Overridepublic void loginDocx(String base64,HttpServletResponse response) throws IOException, XDocReportException {//创建XWPFTemplate对象,并设置读取模板路径和要渲染的数据String path = this.getClass().getClassLoader().getResource("报表公用模板.docx").getPath();String filePath = URLDecoder.decode(path, "UTF-8");//如果路径中带有中文会被URLEncoder,因此这里需要解码//目前图片在resource目录下String path1 = this.getClass().getClassLoader().getResource("2020101814395601.png").getPath();//标题HashMap<String, Object> title = new HashMap<String, Object>() {{put("title",Texts.of("4.系统日志访问用户top10统计").fontSize(12).bold().create());}};//图片HashMap<String, Object> value = new HashMap<String, Object>() {{put("value", Pictures.ofBase64(base64, PictureType.PNG).center().create());}};//表格HashMap<String, Object> table = new HashMap<String, Object>() {{// 第0行居中且背景为蓝色的表格RowRenderData row0 = Rows.of("序号", "用户名", "次数").center().create();put("table", Tables.create(row0));String id;//结果集List<RowRenderData> renderDataList = new ArrayList<>();renderDataList.add(row0);for (int i = 0; i < 6; i++) {id = String.valueOf(i+1);RowRenderData rowi = Rows.create(id, "酷酷酷", "100");renderDataList.add(rowi);}//list转数组RowRenderData[] rowRenderDatas = renderDataList.toArray(new RowRenderData[renderDataList.size()]);put("table", Tables.create(rowRenderDatas));}};List<Map<String,Object>> listMap = new ArrayList<>();
//        listMap.add(theme);listMap.add(title);listMap.add(value);listMap.add(table);Map<String,Object> map = new HashMap<>();map.put("sections",listMap);XWPFTemplate template = XWPFTemplate.compile(filePath).render(map);//=================生成文件保存在本地文件目录下=================//生成临时文件存放地址String temDir=fileServcie.docxPath();//文件名  带后缀String fileName = "login.docx";FileOutputStream fos = new FileOutputStream(temDir+ CommonConstant.SEPARATOR +fileName);template.write(fos);PoitlIOUtils.closeQuietlyMulti(template, fos);}
}

java 动态导出word文档 文档合并分页,浏览器下载,生成,动态表格,加图片相关推荐

  1. 【Java实现导出Word文档功能 XDocReport +FreeMarker】

    Java实现导出Word文档功能(XDocReport +FreeMarker) 前言 在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表.医院的患者统计报表.电商平台的 ...

  2. java循环导出word文档_Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  3. java 中导出word后压缩文件_Java批量导出word压缩后的zip文件案例

    一.js代码,由于参数比较大所以利用form表单使用post导出 function export_word(){ var selectedRows = $("#dg").datag ...

  4. java freemarker导出word 带图片,文件导出后图片无法使用office正常打开

    问题记录:java freemark导出word 带图片,文件导出后图片无法使用office正常打开,解决之! 现象:wps打开正常,office如下 修改点: 图片${image1}标签前后保证无空 ...

  5. Java poi导出word文件

    Java在导出word文件时主要对表格中内容垂直居中处理做以记录方便后续碰到类似问题解决. maven pom.xml中添加poi依赖 <!-- word.excel工具 --> < ...

  6. java freemark导出word (模板、单张图片、多张图片源码)

    java freemark导出word (模板.单张图片.多张图片源码) 首先模板设置 代码编辑 设置word只读.全部 环境设置.jar包 模板设置 ** 设置模板然后另存为 这里一定要选择对xml ...

  7. Java+freemarker 导出Word文档的实现(包括word for Mac 插入域的方法)-静态数据,动态表格list

    1. 准备环境 1.1 word版本:MacOS系统下的Office360 word for Mac下好多操作和win的不一样啊啊啊,差点栽在Mac word的模版设计上. win版本的word模版设 ...

  8. Java——EasyPoi导出word文档,itextpdf转换pdf

    EasyPoi导出word文档,itextpdf转换pdf 文章目录 EasyPoi导出word文档,itextpdf转换pdf 前言 一.依赖 二.工具类 1.WordUtil 2.PDF工具类 3 ...

  9. JAVA 数据导出Word文档模板的功能实现

    对于这个功能,想必也有其他平台会需要吧.比如51job导出文档形式的简历这样.我在这里讲的是用java代码能满足我们实现这一功能的好用的一些方法.废话不多说了. 这种导出word,用XML的方式实现, ...

  10. java 导出wps_java如何导出word和wps文档

    使用场景:打开一个表单页面,导出word或wps文件,代码框架基于springboot+jpa 一.准备word模板 二.pom.xml文件中引入依赖 cn.afterturn easypoi-bas ...

最新文章

  1. HDU(1856),裸的带权并查集
  2. Linux疑难杂症解决方案100篇(一)-静态链表全解析
  3. Can‘t connect to MySQL server on ‘localhost‘ (10061) 解决方法
  4. iOS开发-63】Unknown type name CGRect,did you mean Rect?的解决方案
  5. Java面试题 Java如何进行高效的数组拷贝?【Arrays.copyOf()】
  6. wxpython下载很慢_FAQ:在 Windows 使用 Python
  7. all方法 手写promise_前端进阶高薪必看手写源码篇
  8. print输出保存到txt
  9. c语言标识符的规范,初识C语言-声明和使用变量、标识符的命名规范以及基本数据类型...
  10. access mysql 升迁_随说秋色园从Access升迁到MSSQL过程
  11. 剑指offer:字符串的排列
  12. Kali学习 | 密码攻击:6.10 创建密码字典
  13. C语言 汇总笔记(小甲鱼:带你学C带你飞)
  14. A/D转换器主要性能参数
  15. 【脑电数据十折交叉验证】实现对数据自动划分训练集与测试集得出平均分类准确率
  16. mysql 1114_mysql 解决 ERROR 1114 (HY000): The table 'XXX' is full
  17. 基于天地图的应用服务系统设计开发—以甘肃高校招生服务为例
  18. EBCDIC 与 GBK 的字符编码及其转换(转)
  19. 以太坊·电影院场景区块链应用探索
  20. BLDC(直流无刷电机)反电动势测量/观测模型

热门文章

  1. BMW BENZ AUDI 宝马,奔驰,奥迪维修标准工时,从KSD,WIS, ELSA 中提取。
  2. zabbix微信告警HTML,ZABBIX实现微信告警
  3. 电脑查看已连接的wifi密码
  4. AE484 3D大气电影风格LOGO视频片头爆炸烟雾粒子碎片特效动画制作ae模板
  5. 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(2):n阶行列式、对换
  6. 软考A计划-真题-分类精讲汇总-第十五章(数据库设计)
  7. VMware vSphere 创建虚拟机时SCSI适配器的选择
  8. Ant Design 前端页面设计汇总
  9. linux:ls、ls -l、ls -al区别
  10. 5349. 安排电影院座位