1.需求

导出用户信息,模板如下:

要求:导出多个用户信息时,另起一页,根据模板生成下一条用户信息。

2.模板变化

  • easypoi不能直接创建空白页(下一页),但可以使用apache的poi中的document.createParagraph().createRun().addBreak(BreakType.PAGE)来创建空白页(下一页)。
  • 根据需求需要将word总的表格动态生成多个表格,并且每个表格都需要新建空白页。例如:需要将4个user的信息导出,则模板需要变化成如下:

    然后通过easypoi使用变化后的模板导出word数据

3.具体代码如下

        <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.4.0</version></dependency>

3.1 复制模板

目的是将初始模板改变成第二章节中的模板

package com.lylp.office.utils;import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.word.WordExportUtil;
import com.lylp.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xwpf.usermodel.BreakType;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;/*** word/excel导出工具类<br>* <a url="http://doc.wupaas.com/docs/easypoi">官网文档</a>*/
@Slf4j
public class OfficeExportUtils {/*** 复制word中的表格* @param templatePath 源文件* @param targetPath 目标文件* @param varPrefix 变量前缀* @param copyNum 拷贝数量* @param isNewPage 是否新增页*/public static void copyWordTable(String templatePath, String targetPath, String varPrefix, int copyNum, boolean isNewPage) {File targetFile = new File(targetPath);XWPFDocument document = null;FileOutputStream out = null;try {document = new XWPFDocument(new FileInputStream(templatePath));List<XWPFTable> tables = document.getTables();if (CollectionUtils.isEmpty(tables)) {return;}List<XWPFTable> srcTables = new ArrayList<>(tables);for (int i = 1; i <= copyNum; i++) {XWPFParagraph paragraph = document.createParagraph();if (isNewPage) {//新增空白页paragraph.createRun().addBreak(BreakType.PAGE);}String newVarPreFix = "" + varPrefix + i;for (int j = 0; j < srcTables.size(); j++) {XWPFTable srcTable = srcTables.get(j);XWPFTable newTable = document.createTable();for (int n = 0; n < srcTable.getRows().size(); n++) {XWPFTableRow srcRow = srcTable.getRows().get(n);XWPFTableRow newRow = newTable.insertNewTableRow(n);copyTableRow(srcRow, newRow, varPrefix, newVarPreFix);}newTable.removeRow(newTable.getRows().size() - 1);}}out = new FileOutputStream(targetFile);document.write(out);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e.getMessage());} finally {try {if (out != null) {out.close();}if (document != null) {document.close();}} catch (Exception e) {e.printStackTrace();}}}/*** 复制word中的表格行* @param srcRow 源表格行* @param newRow 目标表格行* @param varPrefix 源变量前缀* @param newVarPreFix 新变量前缀*/private static void copyTableRow(XWPFTableRow srcRow, XWPFTableRow newRow, String varPrefix, String newVarPreFix) {int size = srcRow.getTableCells().size();for (int i = 0; i < size; i++) {newRow.addNewTableCell();}newRow.getCtRow().setTrPr(srcRow.getCtRow().getTrPr());for (int i = 0; i < size; i++) {copyTableCell(srcRow.getCell(i), newRow.getCell(i), varPrefix, newVarPreFix);}}/*** 复制word中的表格cell* @param srcCell 源表格cell* @param newCell 目标表格cell* @param varPrefix 源变量前缀* @param newVarPreFix 新变量前缀*/private static void copyTableCell(XWPFTableCell srcCell, XWPFTableCell newCell, String varPrefix, String newVarPreFix) {newCell.getCTTc().setTcPr(srcCell.getCTTc().getTcPr());for (int i = 0; i < newCell.getParagraphs().size(); i++) {newCell.removeParagraph(i);}for (XWPFParagraph srcParagraph : srcCell.getParagraphs()) {XWPFParagraph newParagraph = newCell.addParagraph();copyParagraph(srcParagraph, newParagraph, varPrefix, newVarPreFix);}}/*** 复制word中的表格Paragraph* @param srcParagraph 源表格Paragraph* @param newParagraph 目标表格Paragraph* @param varPrefix 源变量前缀* @param newVarPreFix 新变量前缀*/private static void copyParagraph(XWPFParagraph srcParagraph, XWPFParagraph newParagraph, String varPrefix, String newVarPreFix) {newParagraph.getCTP().setPPr(srcParagraph.getCTP().getPPr());for (int i = 0; i < newParagraph.getRuns().size(); ++i) {newParagraph.removeRun(i);}for (XWPFRun srcRun : srcParagraph.getRuns()) {XWPFRun newRun = newParagraph.createRun();copyRun(srcRun, newRun, varPrefix, newVarPreFix);}}/*** 复制word中的表格Run* @param srcRun 源表格Run* @param newRun 目标表格Run* @param varPrefix 源变量前缀* @param newVarPreFix 新变量前缀*/private static void copyRun(XWPFRun srcRun, XWPFRun newRun, String varPrefix, String newVarPreFix) {newRun.getCTR().setRPr(srcRun.getCTR().getRPr());newRun.setText(StringUtils.isNoneBlank(varPrefix) && StringUtils.isNotBlank(srcRun.text()) ? srcRun.text().replace(varPrefix, newVarPreFix) : srcRun.text());}}

3.2 导出user数据

例如导出4个user数据

package com.lylp.test;import cn.afterturn.easypoi.word.WordExportUtil;
import com.lylp.office.utils.OfficeExportUtils;
import org.apache.commons.io.FileUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;public class UserExportTest {public static void main(String[] args) {File file = new File("E:\\workspace\\springboot-shiro-mybatis\\easypoi-office\\src\\main\\resources\\template\\userTemplate.docx");String temp = FileUtils.getFile(FileUtils.getTempDirectory(), UUID.randomUUID().toString() + ".docx").getAbsolutePath();System.out.println(temp);String varPrefix = "user";Map<String, Object> users = getUser(varPrefix);int copyNum = 3;//复制模板,由于基础模板“userTemplate.docx”中已经有一个表格,因此只需要在复制3个表格即可OfficeExportUtils.copyWordTable(file.getAbsolutePath(), temp, varPrefix, copyNum, true);//使用easypoi导出user数据File outFile = FileUtils.getFile(FileUtils.getTempDirectory(), UUID.randomUUID().toString() + ".docx");FileOutputStream out = null;XWPFDocument xwpfDocument = null;Workbook workbook = null;try {xwpfDocument = WordExportUtil.exportWord07(temp, users);out = new FileOutputStream(outFile);xwpfDocument.write(out);} catch (Exception e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}if (xwpfDocument != null) {try {xwpfDocument.close();} catch (IOException e) {e.printStackTrace();}}if (workbook != null) {try {workbook.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 创建4个user信息* @param varPrefix user变量名前缀* @return user信息*/private static Map<String, Object> getUser(String varPrefix) {Map<String, Object> users = new HashMap<>();for (int i = 0; i < 4; i++) {Map<String, Object> user = new HashMap<>();user.put("name", "张三" + i);user.put("sex", i % 2 == 0 ? "男" : "女");user.put("age", 25 + i);user.put("birthday", "2022-05-25");List<Map<String, Object>> homes = new ArrayList<>();for (int j = 0; j < 3; j++) {Map<String, Object> home = new HashMap<>();home.put("xh", j + 1);home.put("address", "四川省成都市高新区");home.put("no", (i + 1) + "-" + (j + 1) + "号");home.put("data", "2022-01-01");homes.add(home);}user.put("homes", homes);if (i == 0) {users.put(varPrefix, user);} else {users.put(varPrefix + i, user);}}return users;}
}

java easypoi导出word时添加空白页导出多组相同类型的数据相关推荐

  1. word转PDF空白页的添加与删除

    word转PDF空白页的添加与删除 word转PDF空白页的添加与删除 **关于论文排版中页面设置的一些小技巧. 1:不希望用换行的方式将"第二章"的标题赶到下一页,如下图: 这样 ...

  2. word文档如何快速添加空白页

    我们有时在审阅或查看文件时,为了编辑需要会想到插入一页的内容,那怎么在文档中间添加空白页呢,以最常见的speedoffice为例. 首先,用speedoffice打开一份Word文档,光标定位在需要添 ...

  3. speedoffice使用方法-word怎么快速添加空白页

    我们有时在审阅或查看文件时,会突然想到插入一页的内容,那怎么在文档中间添加空白页呢,以最常见的speedoffice为例. 首先,用speedoffic一页e打开Word文件,光标放在需要添加空白页的 ...

  4. java PDF最后一页添加空白页

    PdfReader reader = new PdfReader(src); FileOutputStream out = new FileOutputStream(new File(pdfPath) ...

  5. Word怎么删除空白页操作方法 Word删除空白页的办法详解oldtimeblog

    word怎么删除空白页操作方法 Word删除空白页的办法详解 相信大家对Word办公软件很是熟悉吧,因为我们天天都有在使用它.我们平时在使用Word写文档时,经常遇到在编辑处理完文档后会发现Word中 ...

  6. Word怎么删除空白页?分享5个基础方法!

    案例:Word怎么删除空白页 [我最近在用word写文章,但经常都会遇到的一个问题就是总是会有空白页,使用word时怎么删除空白页呢?请大家给我支支招吧!] 在使用Microsoft Word编辑文档 ...

  7. Word怎么删除空白页,4个方法轻松解决!

    案例:我在编辑文档的时候会遇到空白页,我不能直接对它进行删除操作.我想知道如何删除Word里面的空白页?方法越简单越好! Word是广泛使用的办公软件之一,但有时在编辑文档时会遇到一些空白页的问题.空 ...

  8. Word中删除空白页并保留分节符的方法

    Word中删除空白页并保留分节符的方法 word中有时需要使用分节符来分割文档格式,但是有时候分节符会导致空白页产生,但是分节符又不能去掉,下面是解决这种情况的方法 注意:如果是在论文等双面打印,并且 ...

  9. word怎么删除空白页?

    有很多新手用户在使用word的时候发现里面出现了很多的空白页,穿插分布在文档中.那么word怎么删除空白页,这里小编为大家带来了原因分析和四种解决方法,快来看看吧! 四个删除word的空白页的小妙招 ...

最新文章

  1. 如何使用 OpenCV Python 检测颜色
  2. 【BZOJ】1045: [HAOI2008]糖果传递(中位数)
  3. PHP如何识别系统语言或浏览器语言
  4. 使用Okta的单点登录保护您的Vert.x服务器
  5. Android 通信 EventBus
  6. 社交电商为什么这么火
  7. 销售订单无法使用折扣(其他可以正常使用)
  8. 哎呀!可能有弹出式窗口拦截器生成Gmail无法打开该网页。如果您使用弹出式窗口拦截器,请将其关闭以便打开窗口。...
  9. 【时间序列分析】01.时间序列与平稳序列
  10. 一种便携式导弹飞控系统外场实时仿真测试系统设计
  11. 用QuickCHM v2.6 制作帮助文档
  12. 两轮车ECU的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  13. 机器学习 识别图片人物动作_一键学习人物识别说明
  14. 图像标注工具CVAT
  15. 不懂量子力学?那你可以试试在家里做这五个实验!
  16. 直接数字下变频(2):贝塞尔插值法
  17. Mac如何保护苹果账户的安全?保护 Apple ID 帐户的技巧分享
  18. JavaScript(第四天)—爱创课堂专业前端培训
  19. 计算机cpu对什么访问最快,CPU直接访问的存储器是什么?
  20. windows聚焦壁纸不更新_win10系统锁屏壁纸聚焦不更新的解决方法

热门文章

  1. idea代码补全修改,常用快捷键
  2. C++内存越界问题请教
  3. Java学习笔记:模拟实现微信零钱通(面向过程和OOP两种方法)
  4. Flutter 键盘主题色怎么修改.....
  5. 访问Oculus需要配置的hosts
  6. 库克“坐视不理”,与苹果共同芯片,山寨AirPods到底有多“横”?
  7. 如何写出头条号原创爆文?这几招教你拿下
  8. 苹果系统和安卓系统的区别_MIUI12发布—安卓系统最接近苹果系统的一次
  9. 微信公众号开发 授权回调域名 微信授权验证
  10. 服务器dasd灯亮系统盘黄灯,IBM3650 M3无法开机 dasd黄灯亮、按键盘也无效