网易首页 > 网易号 > 正文 申请入驻

Java基于POI填充Word模板

0
分享至

最近有个需求,就是要根据用户订单信息来填充现有的Word模版,从而生成一个在线电子文档,再通过易企签来实现线上签字确认。

我们先来看看模板


这是我们项目上的大概文档,因为要涉及到一些文字替换和段落删减,引入了一些符号替换规则。

POI操作Word的常用属性

在操作之前,我们需要了解一下属性和方法

  • XWPFDocument:用来获取或者创建一个Word文档
  • XWPFParagraph:标题、文档、表格等
  • XWPFRun:同样风格的一段文本
  • XWPFTable:表格
  • XWPFTableRow:表格中的一行
  • XWPFTableCell:表格中的一个单元格

填充Word模版

现在我们就开始实践-填充我们上面的模版

引入POI包

org.apache.poigroupId>poiartifactId>${poi.version}version>dependency>org.apache.poigroupId>poi-ooxmlartifactId>${poi.version}version>dependency>

这里的变量值是。

4.1.0

获取文档对象

由于我的文档模版是存储在GridFS中(其实我更倾向于MinIO),所以我的通过文件流的形式读取

//通过文件读取XWPFDocument document = new XWPFDocument(OPCPackage.open(filePath));//通过文件流读取,in是InputStream对象XWPFDocument document = new XWPFDocument(in);

获取到文档之后,就可以从中获取到对应的XWPFParagraph对象

List

paragraphs = document.getParagraphs();

让后我们可以从XWPFParagraph获取到Text即段落中的内容,但是我们要替换段落中的内容的话必须在XWPFRun才行。所以需要循环遍历去处理

for (XWPFParagraph paragraph : paragraphs) { List runs = paragraph.getRuns(); for (XWPFRun run : runs) { }}

这里我们可以通过run.toString()获取到内容,并通过run.setText进行替换。在我们获取到文本之后,要匹配出对象的关键字,所以这里需要一个正则匹配

private static List getKeywords(String source) { String regStr = "\\$\\{[a-zA-Z0-9]+\\}"; List matchStrs = new ArrayList<>(); Pattern patten = Pattern.compile(regStr); Matcher matcher = patten.matcher(source); while (matcher.find()) { matchStrs.add(matcher.group()); } return matchStrs; }

我们通过getKeywords获取到模版中的关键字后,再从Map对象中去取出对应的值,然replace掉

for (XWPFParagraph paragraph : paragraphs) { List

runs = paragraph.getRuns(); for (XWPFRun run : runs) { String value=run.ToString(); List

keywords = getKeywords(value); for (String keyword : keywords ) { String key = keyword.replace("${", "").replace("}", ""); String keyValue = sourceTextMap.get(key); if (StringUtils.isEmpty(keyValue)) { keyValue = ""; } value = value.replace(keyword, keyValue); } run.setText(value,0); } }

一般的内容可以通过${key}的方式来替换,那么遇到表格怎么办呢?我继续来处理表格

List

tables = document.getTables();

我这里先只针对我的模版进行处理,如果是遇到多个XWPFTable那么就根据情况自行处理吧

for (int i = 1; i < tableList.size(); i++) { XWPFTableRow newRow = table.createRow(); List cells = newRow.getTableCells(); for (int j = 0; j < cells.size(); j++) { XWPFTableCell cell = cells.get(j); cell.setText(tableList.get(i - 1)[j]); }}if (!ObjectUtils.isEmpty(tableBottom)) { XWPFTableRow tableRow = table.createRow(); List footerCells = tableRow.getTableCells(); for (int j = 0; j < footerCells.size(); j++) { XWPFTableCell cell = footerCells.get(j); if (!StringUtils.isEmpty(tableBottom[j])) { XWPFParagraph paragraph = cell.addParagraph(); XWPFRun xwpfRun = paragraph.createRun(); xwpfRun.setText(tableBottom[j]); xwpfRun.setFontSize(12); xwpfRun.setFontFamily("黑体"); xwpfRun.setBold(true); xwpfRun.setColor("000000"); } else { cell.setText(tableBottom[j]); } }}

这里就会根据我们的传入的tableList即表格数据进行填充。根据tableBottom数组来添加一些样式。最后来看看我们做出的效果,首先是用Swagger调用接口

{ "fileName":"xxx订单导出.doc", "filePath":"order_template.docx", "headerContent":{ "orderDate":"2020-03-26 10:25", "planDate":"202-03-27", "orderNo":"20200325000074645", "agreeNo":"80192000035", "orderUnitNo":"155283", "orderUnitName":"小卖部农业开发有限公司", "name":"IT界摸鱼专家", "phone":"138888888", "bankNo":"6666666666666666573", "owe":"小鸡炖蘑菇有限公司开发区分公司", "owePrice":"16775.90", "zh":"壹万伍仟捌佰贰拾伍圆零角零分", "isDiaplay":"", "memo":"小鸡炖蘑菇专用配送" }, "tableList":[ [ "113029022", "小鸡炖蘑菇了不起", "2", "T", "50", "2000.00", "300000.00", "" ], [ "113029044", "小鸡炖蘑菇真棒", "1.5", "T", "75", "3000.00", "50000.00", "" ], [ "113029077", "小鸡炖蘑菇好耶", "1.275", "T", "85", "2020.50", "900000.50", "赠品" ], [ "113040057", "小鸡炖蘑菇", "10.025", "T", "255", "12030.00", "200000.20", "" ] ], "tableBottom":[ "合计", "壹万伍仟捌佰贰拾伍圆整", "55.275", "", "852", "", "2255114.00", "60.32T" ]}

上面是我传参数,最后导出的Word文档是这样的


当然,这里还有一些细节需要处理。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
以色列要求民众立即进入避难设施

以色列要求民众立即进入避难设施

界面新闻
2026-02-28 16:16:15
广东一网红宠物狗走失,监控拍到狗狗倒地抽搐被人带走,主人已报警并悬赏寻线索

广东一网红宠物狗走失,监控拍到狗狗倒地抽搐被人带走,主人已报警并悬赏寻线索

三湘都市报
2026-02-28 12:33:29
美国军方预计将对伊朗进行为期多天的行动

美国军方预计将对伊朗进行为期多天的行动

财联社
2026-02-28 15:55:12
意外吗?鲁能一场2比9惨败,彰显了王大雷含金量,接班人遥遥无期

意外吗?鲁能一场2比9惨败,彰显了王大雷含金量,接班人遥遥无期

罗掌柜体育
2026-02-27 16:57:36
湖人内讧接连传出!斯玛特多次表达不满,防守懒散,还拿自己当腕

湖人内讧接连传出!斯玛特多次表达不满,防守懒散,还拿自己当腕

你的篮球频道
2026-02-28 10:11:44
陈伟霆何穗春节在顺义带娃翻车 两万外套不抵五毛棒棒糖吗

陈伟霆何穗春节在顺义带娃翻车 两万外套不抵五毛棒棒糖吗

阿废冷眼观察所
2026-02-28 10:59:12
悲催!不自量力把婚离了,饭碗也碎了,50多岁保险女如今欲哭无泪

悲催!不自量力把婚离了,饭碗也碎了,50多岁保险女如今欲哭无泪

火山詩话
2026-02-27 06:14:00
雷克萨斯ES双色特别版上市 售30.79万元起

雷克萨斯ES双色特别版上市 售30.79万元起

车质网
2026-02-26 09:20:11
你在体制内捅过的最大篓子是啥? 网友:人怎么能捅这么大的篓子

你在体制内捅过的最大篓子是啥? 网友:人怎么能捅这么大的篓子

带你感受人间冷暖
2026-02-13 10:06:39
南京市档案馆查到谷爱凌外婆冯国珍的珍贵历史档案,确定其为南京户籍

南京市档案馆查到谷爱凌外婆冯国珍的珍贵历史档案,确定其为南京户籍

极目新闻
2026-02-27 10:42:46
离婚次日,婆婆命令我伺候她住院七天,我打了一个电话婆婆傻眼

离婚次日,婆婆命令我伺候她住院七天,我打了一个电话婆婆傻眼

奶茶麦子
2026-02-28 11:48:18
普京不装了!2500枚导弹连夜运抵伊朗,美军这次踢到铁板了!

普京不装了!2500枚导弹连夜运抵伊朗,美军这次踢到铁板了!

局势帝
2026-02-27 18:08:52
国家说要给你涨工资,这或许是最危险的好消息

国家说要给你涨工资,这或许是最危险的好消息

流苏晚晴
2026-01-17 19:43:15
5胞胎在武汉顺利出生,孩子爸爸称名字已取好,回家就给老婆买黄金;专家曾建议减胎,但孩子父母不忍心

5胞胎在武汉顺利出生,孩子爸爸称名字已取好,回家就给老婆买黄金;专家曾建议减胎,但孩子父母不忍心

极目新闻
2026-02-27 11:05:33
宗馥莉在上海高档餐厅露面,与外籍男士共进晚餐,同行女孩画面温馨

宗馥莉在上海高档餐厅露面,与外籍男士共进晚餐,同行女孩画面温馨

东方不败然多多
2026-02-25 16:20:33
环球影城:一游乐项目突发故障致2人重伤!索赔超30万元!

环球影城:一游乐项目突发故障致2人重伤!索赔超30万元!

特种设备安全科普
2026-02-27 11:34:42
樊振东到底做了什么?让9连败的他,终于赢了张本智和!

樊振东到底做了什么?让9连败的他,终于赢了张本智和!

曹老师评球
2026-02-27 21:12:33
樊振东也没想到,德国总理访华仅1天,自己竟因一段采访口碑暴涨

樊振东也没想到,德国总理访华仅1天,自己竟因一段采访口碑暴涨

寒士之言本尊
2026-02-27 13:21:48
许家印,在恒大王国里,过足了官瘾、钱瘾、色瘾,金蝉脱壳玩死了

许家印,在恒大王国里,过足了官瘾、钱瘾、色瘾,金蝉脱壳玩死了

混沌录
2025-09-12 00:29:10
笑不活了!德媒急喊:总理,访华千万别跪!默茨的两难,藏不住了

笑不活了!德媒急喊:总理,访华千万别跪!默茨的两难,藏不住了

魏家东
2026-02-27 15:50:13
2026-02-28 16:56:49
自学编程之道
自学编程之道
分享自学编程的心得,分享实用开源项目
48文章数 240关注度
往期回顾 全部

科技要闻

狂揽1100亿美元!OpenAI再创融资神话

头条要闻

内塔尼亚胡:美以军事行动目标是推翻伊朗政权

头条要闻

内塔尼亚胡:美以军事行动目标是推翻伊朗政权

体育要闻

球队主力全报销?顶风摆烂演都不演了

娱乐要闻

疑似王一博被爆私密聊天记录

财经要闻

沈明高提共富建议 百姓持科技股国家兜底

汽车要闻

岚图泰山黑武士版3月上市 搭载华为四激光智驾方案

态度原创

时尚
本地
房产
家居
军事航空

被章若楠、秦岚带火的鞋子竟然是它?春天这样穿又美又气质!

本地新闻

津南好·四时总相宜

房产要闻

滨江九小也来了!集齐海侨北+哈罗、寰岛...江东教育要炸了!

家居要闻

素色肌理 品意式格调

军事要闻

美国以色列联合袭击伊朗 实时战况

无障碍浏览 进入关怀版