使用java按模板导出word,有很多方案,比如freemarker,jacob,openoffice,aspose(非开源收费,需破解版)apache poi等,其中比较常用的是freemarker导出,但是必须把预先做好的word模板转换成xml格式(ooxml)并且要到xml中找到需要循环的位置,插入freemarker的循环语法表达式,每次模板一变动都要重新做模板,比较不友好,其次就是poi,这个开源框架对excel支持多,对word支持少一点,文档不充分,因为缺少文档,使用起来很困难,easypoi是建立在poi的基础之上,弥补了poi的不足,因为依赖poi,同样是对excel支持多,word支持少,那么怎么使用easypoi来循环模板里的行列导出呢,根据官方的文档,在模板里插入形如{{$fe: list t.id t.name t.pwd}}即可实现,插入#fe支持横向循环,可是我使用#fe导出并没有生效,于是查看源码发现根本没有实现#fe,没办法,只有把easypoi的源码pull下来,自己修改实现。

模板如下:

导出效果如下:

测试代码如下:

package test;import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author ww* @date 2022-05-20 0:08*/
public class Test {public static void main(String[] args) {Map<String,Object> params = new HashMap<>();params.put("companyName","卢佳玉电站222");params.put("serialNo","20220504011");params.put("startTime","2022-05-19 19:30:00");params.put("endTime","2022-05-20 19:30:00");params.put("signer","吴晓丽");params.put("signTime","2022-05-18 00:30:00");params.put("workleaName","张三");params.put("workappName","张四");params.put("teamName","张wu");params.put("teamMemberLabel","li1,li2,li3");params.put("workplaceDevice","测试任务和设备名称");params.put("workTask","测试任务");params.put("dutyName","李波");List<Map<String,Object>> workSecs = new ArrayList<Map<String,Object>>();Map<String,Object> workSec1 = new HashMap<>();workSec1.put("index",1);workSec1.put("secMeasure","措施1");workSec1.put("execCondition","已执行");workSec1.put("confirmExec","已确认");workSecs.add(workSec1);Map<String,Object> workSec2 = new HashMap<>();workSec2.put("index",2);workSec2.put("secMeasure","措施2");workSec2.put("execCondition","已执行");workSec2.put("confirmExec","已确认");workSecs.add(workSec2);params.put("workSecs",workSecs);List<Map<String,Object>> perSecs = new ArrayList<Map<String,Object>>();Map<String,Object> perSec1 = new HashMap<>();perSec1.put("index",1);perSec1.put("secMeasure","人员措施1");perSec1.put("execCondition","已执行");perSecs.add(perSec1);Map<String,Object> perSec2 = new HashMap<>();perSec2.put("index",2);perSec2.put("secMeasure","人员措施2");perSec2.put("execCondition","已执行");perSecs.add(perSec2);params.put("perSecs",perSecs);List<Map<String,Object>> teamMems  = new ArrayList<Map<String,Object>>();Map<String,Object> teamMem1 = new HashMap<>();teamMem1.put("mem","陕小军");teamMem1.put("title","告知  ");teamMem1.put("notify","已通知");teamMems.add(teamMem1);Map<String,Object> teamMem2 = new HashMap<>();teamMem2.put("mem","郭晓东");teamMem2.put("title","告知  ");teamMem2.put("notify","已通知 ");teamMems.add(teamMem2);Map<String,Object> teamMem3 = new HashMap<>();teamMem3.put("mem","郭睿洪");teamMem3.put("title","告知");teamMem3.put("notify","已通知");teamMems.add(teamMem3);Map<String,Object> teamMem4 = new HashMap<>();teamMem4.put("mem","郭睿洪");teamMem4.put("title","告知");teamMem4.put("notify","已通知");teamMems.add(teamMem4);Map<String,Object> teamMem5 = new HashMap<>();teamMem5.put("mem","郭睿洪");teamMem5.put("title","告知");teamMem5.put("notify","已通知");teamMems.add(teamMem5);/*Map<String,Object> teamMem6 = new HashMap<>();teamMem6.put("mem","郭睿洪");teamMem6.put("title","告知");teamMem6.put("notify","已通知");teamMems.add(teamMem6);Map<String,Object> teamMem7 = new HashMap<>();teamMem7.put("mem","郭睿洪");teamMem7.put("title","告知");teamMem7.put("notify","已通知");teamMems.add(teamMem7);*/params.put("teamMems",teamMems);exportWord2("d:/test/t1_A4.docx","D:/test","aaa.docx",params);}public static void exportWord2(String templatePath, String temDir, String fileName, Map<String, Object> params) {/*  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 {XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);String tmpPath = temDir + fileName;FileOutputStream fos = new FileOutputStream(tmpPath);doc.write(fos);fos.flush();// 设置强制下载不打开// 设置文件名//doc.write(out);//out.close();} catch (Exception e) {e.printStackTrace();} finally {//delFileWord(temDir,fileName);//这一步看具体需求,要不要删}}
}

如果有不足之处,欢迎大家共同讨论,email:395263841@qq.com

easypoi按模板导出word不支持列循环迭代问题相关推荐

  1. easypoi根据模板导出word

    easypoi根据模板导出word 在工作中,模板导出必不或缺,实现模板导出的第三方工具包也有很多.例如:poi.freemaker.hutool的word工具类以及第三方报表工具.这里我简单介绍一下 ...

  2. poi-tl,根据word模板导出word(表格行循环,表格无表头的情况)

    最近项目里要做一个根据客户提供的word模板导出word的功能,方法有很多,比如easyPoi(对word的支持并不是很好),freeMark(太麻烦不想研究),以及poi-tl, 最后研究了半天发现 ...

  3. springboot使用easypoi根据模板导出word。解决本地可以导出。打包到服务器导出报错的问题

    最近项目用到了springboot导出word. 使用了这篇博客里的方法  https://blog.csdn.net/Tomwildboar/article/details/89856470 在本地 ...

  4. 使用EasyPoi根据模板导出Excel或word文档

    接着上篇文章 Java根据模板导出Excel并生成多个Sheet 简单介绍下EasyPoi的使用,直接上代码吧 首先当然是先引入jar包了,看下图 其次,还是贴代码吧看实例,下面是根据模板导出的工具类 ...

  5. EasyPoi模板导出word(简单文本、内嵌表格、循环图片)

    EasyPoi模板导出word(简单文本.内嵌表格.循环图片) 先上效果图 模板在此 依赖导入 *坑:注意依赖版本 4.3.0+才支持多图片循环导出 <!-- word导出 方式:easypoi ...

  6. 根据模板导出word,复合格式表格生成、可变列表格生成

    系列文章目录 第一章:springboot下生成复杂word文档方案 在Word软件里面制作模板 第三章:doc和docx插入多图 第四章:web环境下word文档预览 根据模板导出word,复合格式 ...

  7. POI根据模板导出word文件,以及word转PDF,PDF转图片再插入PDF中(防止PDF被修改)

    POI操作word和PDF POI根据模板导出word文件 word转PDF PDF转图片再插入PDF中(防止PDF被修改) POI根据模板导出word文件 一.制作word模版,${xxxx}是一会 ...

  8. springboot中使用freemarker根据flt模板导出word、pdf文档

    1.导包: <!--FreeMarker --> <dependency><groupId>org.springframework.boot</groupId ...

  9. Easypoi使用模板导出文档或excel表格详解

    Easypoi使用模板导出docx文档或excel表格详解 **doc或docx文档的模板导出** **Excel的模板导出** 话不多说先上依赖 <dependency><grou ...

最新文章

  1. C#在后台运行操作:BackgroundWorker的用法
  2. MongoDB 数据库、集合创建删除与文档插入
  3. Django出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 134: invalid
  4. ping命令整个过程详解
  5. JDK的下载、安装和配置
  6. Linux使用cpuset设置CPU独占
  7. 磨刀不误砍柴工,使用visual studio之前应该先了解这些...
  8. Python安装教程:
  9. 螺丝螺母垫片顺序图片_如何计算螺丝,螺栓和螺母的尺寸
  10. SMART PLC指针
  11. 激光雷达定位-论文心得
  12. 【实战】如何在手机上实时接收微信小店订单提醒
  13. python api调用 验证码_Python语言调用创蓝253短信验证码API文档
  14. java迭代例子_Java 迭代器的代码实例详解
  15. Python报错ModuleNotFoundError: No module named ‘pyqtgraph‘
  16. SQL自动检查神器项目,吊炸天的功能
  17. 21-7-09 主要元素
  18. 按关键字搜索易贝商品 API
  19. 小程序微信支付功能开发
  20. tensorflow自定义GPU版本op节点

热门文章

  1. 数据在内存中的存储方式——数据类型、内存地址
  2. AJAX入门——不加载整个页面,与服务器交换数据并更新部分网页内容
  3. python pprint用法_如何使用pprint使用内置的str(self)方法打印对象?
  4. 计算机表格加法计算,如何让Excel表格中隐藏的表格不参与求和计算?-电脑教程...
  5. ZOJ 题目分类,学校的一个巨巨做的。
  6. 单耳蓝牙耳机怎么连接_apple watch怎么连接蓝牙耳机
  7. html微信悬浮窗,微信新功能悬浮窗怎么用
  8. 如何实现一个手帐 APP开发
  9. 重庆计算机一级考试2016年,重庆计算机一级考试真题2016年最新(笔试+上机)讲述.doc...
  10. 弹性盒模型(部分布局超好用)