easyPOI之动态导出word模板

  • 一、maven依赖
  • 二、word模板
  • 三、ExportWordUtil工具类
  • 四、MoneyUtil工具类(金额大写转换)
  • 五、word导出Controller层
  • 六、导出样式
  • 七、扩展
    • 1.合并某一列具有相同值的单元格
    • 2.修改ExportWordUtil.java
    • 3.合并之后的word样式

一、maven依赖

<!--EasyPoi导入导出-->
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.3.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.3.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.3.0</version>
</dependency>
<!--注意:word中要使用循环等标签必须单独导入以下依赖--><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>4.1.1</version></dependency>

二、word模板

三、ExportWordUtil工具类

import cn.afterturn.easypoi.word.WordExportUtil;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import org.apache.poi.xwpf.usermodel.XWPFDocument;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;/*** @ClassName: ExportWordUtil* @date:* @author:* @version:word文档导出公共类* @see: [相关类/方法]* @Description:TODO* @since JDK 1.8*/
public class ExportWordUtil {/*** 导出word* <p>第一步生成替换后的word文件,只支持docx</p>* <p>第二步下载生成的文件</p>* <p>第三步删除生成的临时文件</p>* 模版变量中变量格式:{{foo}}* @param templatePath word模板地址* @param temDir 生成临时文件存放地址* @param fileName 文件名* @param params 替换的参数* @param request HttpServletRequest* @param response HttpServletResponse*/public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {Assert.notNull(templatePath,"模板路径不能为空");Assert.notNull(temDir,"临时文件路径不能为空");Assert.notNull(fileName,"导出文件名不能为空");Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");if (!temDir.endsWith("/")){temDir = temDir + File.separator;}File dir = new File(temDir);if (!dir.exists()) {dir.mkdirs();}try {String userAgent = request.getHeader("user-agent").toLowerCase();if (userAgent.contains("msie") || userAgent.contains("like gecko")) {fileName = URLEncoder.encode(fileName, "UTF-8");} else {fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");}XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);String tmpPath = temDir + fileName;FileOutputStream fos = new FileOutputStream(tmpPath);doc.write(fos);// 设置强制下载不打开response.setContentType("application/force-download");// 设置文件名response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);OutputStream out = response.getOutputStream();doc.write(out);out.close();} catch (Exception e) {e.printStackTrace();}finally {delFileWord(temDir,fileName);//这一步看具体需求,要不要删}}/*** 删除零时生成的文件*/public static void delFileWord(String filePath, String fileName){File file =new File(filePath+fileName);File file1 =new File(filePath);file.delete();file1.delete();}
}

四、MoneyUtil工具类(金额大写转换)

/*** 金额转换工具类*/
public class MoneyUtils {private static final String UNIT = "万千佰拾亿千佰拾万千佰拾元角分";private static final String DIGIT = "零壹贰叁肆伍陆柒捌玖";private static final double MAX_VALUE = 9999999999999.99D;public static String change(double v) {if (v < 0 || v > MAX_VALUE){return "参数非法!";}long l = Math.round(v * 100);if (l == 0){return "零元整";}String strValue = l + "";// i用来控制数int i = 0;// j用来控制单位int j = UNIT.length() - strValue.length();String rs = "";boolean isZero = false;for (; i < strValue.length(); i++, j++) {char ch = strValue.charAt(i);if (ch == '0') {isZero = true;if (UNIT.charAt(j) == '亿' || UNIT.charAt(j) == '万' || UNIT.charAt(j) == '元') {rs = rs + UNIT.charAt(j);isZero = false;}} else {if (isZero) {rs = rs + "零";isZero = false;}rs = rs + DIGIT.charAt(ch - '0') + UNIT.charAt(j);}}if (!rs.endsWith("分")) {rs = rs + "整";}rs = rs.replaceAll("亿万", "亿");return rs;}}

五、word导出Controller层

@RequestMapping(value="/getWord", method= RequestMethod.GET)
@ApiOperation(value = "导出报销单word", notes = "导出报销单")
public void getZbrzWord(HttpServletRequest request, HttpServletResponse response) {Map<String,Object> params = new HashMap<>();//word模板地址String wordModelPath = "wordTemplate/ceshi2.docx";//数据预处理Double money=3400.00D;String money_total = MoneyUtils.change(money);Calendar now = Calendar.getInstance();//生成临时文件地址String filePath = "D:\\Download\\";//装填参数params.put("order_number","20210408");params.put("money_total",money_total);params.put("order_money","3400");params.put("y",now.get(Calendar.YEAR));params.put("m",(now.get(Calendar.MONTH) + 1));params.put("d",now.get(Calendar.DAY_OF_MONTH));List<Map<String,Object>> dataList= new ArrayList<>();//动态填充数据for (int i=0;i<2;i++){Map<String,Object> data=new HashMap<>();data.put("index",i);data.put("title","测试"+i);data.put("product_description","单位"+i);data.put("buy_num","数量"+i);data.put("saleprice","单价"+i);data.put("buy_price","总金额"+i);dataList.add(data);}params.put("dataList",dataList);ExportWordUtil.exportWord(wordModelPath,filePath,"ceshi.docx",params,request,response);
}

六、导出样式

七、扩展

1.合并某一列具有相同值的单元格

2.修改ExportWordUtil.java

fromRow 代表起始行
toRow 代表终止行
num 代表获取list对象大小

3.合并之后的word样式

easyPOI之动态导出word模板相关推荐

  1. SpringBoot导出word模板并动态渲染数据

    导出word模板并动态渲染数据 一.需求介绍 背景:需要导出word模板的时候,有些数据是动态或者图片等不确定因素的时候.根据需求定制好的模板要求填充数据,那么这个时候就需要进行根据word模板进行动 ...

  2. Freemarker使用mht制作导出word模板

    Freemarker使用mht制作导出word模板 一.制作word导出模板时,我们使用官方的Office Word编辑样式,编辑好之后,另存为mhtml格式,这样我们就可以看到源代码了.注意:创建w ...

  3. poi导出word模板

    **poi导出word模板段落处理 流程: 1:读取文档:` //获取docx解析对象 XWPFDocument document = new XWPFDocument(POIXMLDocument. ...

  4. 【Java】poi-tl实现导出Word模板并动态渲染数据

    文章目录 前言 优点 缺点 使用 引入依赖 渲染普通占位符 表格渲染 前言 最近做项目的时候会遇到要求要导出以docx格式结尾的报告文件,于是我就在思考有没有一个比较好用的第三方类库能解决在word上 ...

  5. Java动态导出word文档内容及图片

    前言 最近公司在做一个工业柔性产线管控,项目中有一个需求要将工序中流程图及流程图中的子流程及工步相关信息导入到表格中(因为流程图下的子流程图有无及数量未知,所以最好的办法就是使用动态导入):因为以前更 ...

  6. java poi 动态导出word表格带合并效果

    1.引入word导出所需依赖包 工作常用的excel,word导出,需要引入下面的6个主要包,和主要包依赖的其他包 ,可以看下面的表格进行依赖下载引入 这下面的两张图是主要包对应涉及到功能,可以按需要 ...

  7. java word模板替换多行_Java动态替换word模板的最佳实践

    poi-tl 基于word的模板渲染(替换)组件 对docx格式的文档增加模板语法,增加渲染模板的方便性,目前支持对段落.页眉.页脚.表格的文本.图片.表单渲染. 对于word模板替换,我们不仅要考虑 ...

  8. 利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

  9. java poi替换word_利用POI 技术动态替换word模板内容

    项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...

  10. java修改导出模板,java模板导出word模板 java根据word模板导出

    java 调用word模板实现循环套打生成word文档 首先我用的技术是 poi 这是代码,一个工具类得调用 public class WordUtil { /** * 基于模板文件导出 word 文 ...

最新文章

  1. python位运算符
  2. python用selenium爬取网页数据_Python项目实战:使用selenium爬取拉勾网数据
  3. Centos入门-3
  4. django 使用Ajax方式POST JSON数据包
  5. Linux 下源码编译安装 vim 8.1
  6. asp.net 六大对象之Request、Response
  7. php ==gt;,谈谈PHP中的 -gt;、=gt; 和 :: 符号 - 易采站长站
  8. WinRAR 试用版曝漏洞:免费软件并不“免费“
  9. dubbo负载均衡代码分析2(一致性hash策略)
  10. Android Fragment-APP调用其他APP中的Fragment 1
  11. 蛋花花分享8个能提升Web前端开发技能的技巧
  12. 关于Unity资源包导入项目后版本不匹配问题
  13. 60秒学脑科学常识:《科学美国人》专栏文集
  14. Python中str()函数的使用(学习笔记)
  15. Android开发之隐示意图跳转
  16. 基本类型偏执-平行继承体系-令人着迷的暂时值域
  17. [大话设计模式C++版] 第7章 为别人做嫁衣 —— 代理模式
  18. 分享一个自定义桌面程序框架
  19. 2022“杭电杯”中国大学生算法设计超级联赛(8)补题 1011 (持续更新中)
  20. 基于空间金字塔网络的光流估计

热门文章

  1. 如何解决电脑网络提示无Internet访问权限
  2. python 函数调用自身_Python-函数的递归调用
  3. React15中的栈调和diff算法
  4. c语言 椭圆周长,高中数学公式大全
  5. windows server添加角色
  6. Fiddler 移动端/模拟器安装证书
  7. 物联网是什么,和互联网之间主要有什么区别
  8. React纯前端生成word文档(支持多图片导出)
  9. JAVA关于实现科大讯飞语音合成功能
  10. android 7 zip压缩文件,7-zip怎么把大文件压缩到最小