java导出word文件损坏_记录一次POI导出word文件的细节问题
首先百科一下POI是什么:
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。通过字面意思,我们大概知道这个API是可以用来做 java 导出word 及excel 的。下面不废话了,直接总结一下,java 用模板导出 word 的方法。目前项目中我用到的方法分为两种(今天先说第一种)。
1.使用poi读取模板word,然后导出所需要的word。
先说一下准备工作:
1.1 所需jar 包:这里我使用的是poi-3.9 jar 包,下面上依赖:
org.apache.poi
poi-ooxml
3.9
org.apache.poi
ooxml-schemas
1.1
1.2 模板文件 xxxx.docx
这里要说一下有一个小坑,poi-3.9 目前只支持读取 .docx 格式的 word,也就是office 2007以后的格式。请大家注意使用时把 word 模板改为 .docx 后缀名。然后就是准备好替换的模板,如下图:
PS:这里重点说明一下,一个问题,就是在输入占位符的时候,一定一定一定要是从做到右连续输入占位符,不然会被识别为多个片段,导致占位符不匹配,!!!!!!!困扰了我半天,所以来特此记录一下0.0
下面直接上代码,注意看步骤:
String path = request.getSession().getServletContext().getRealPath("/exceldemo/关于安排2017年市级机关住房解困资金的报告.docx");//获取模板路径
FileInputStream is = new FileInputStream(path);//读入流中
XWPFDocument xdf = new XWPFDocument(is);//新建一个word文档
//变量
Map params = new HashMap();
params.put("year", year);
params.put("month", month);
params.put("day", day);
params.put("win",win);
this.replaceText(xdf,params);//替换word中的变量。
这里用了一个方法replaceText(),就是替换变量的方法,代码如下:
/**
* 替换文档中的参数(word)
* @param doc
* @param params
*/
private void replaceText(XWPFDocument doc, Map params) {
Iterator iterator = doc.getParagraphsIterator();
XWPFParagraph para;
while (iterator.hasNext()) {
para = iterator.next();
this.replaceInPara(para, params);
}
}
/**
* 替换段落中的参数(word)
* @param para
* @param params
*/
private void replaceInPara(XWPFParagraph para, Map params) {
List runs;
Matcher matcher;
if (matcher(para.getParagraphText()).find()) {
runs = para.getRuns();
for (int i=0; i
XWPFRun run = runs.get(i);
String runText = run.toString();
matcher = matcher(runText);
if (matcher.find()) {
while ((matcher = matcher(runText)).find()) {
runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
}
para.removeRun(i);
//重新插入run里内容格式可能与原来模板的格式不一致
para.insertNewRun(i).setText(runText);
}
}
}
}
下面看看替换后的效果:
博客原址:https://blog.csdn.net/ahutdbx/article/details/81326092
java导出word文件损坏_记录一次POI导出word文件的细节问题相关推荐
- java文件损坏_用java下载文件 - 文件损坏
这里是我的code.i写这个下载MP3苍蝇,视频文件&图像. 我用FileOutputStream中处理文件.. 的所有文件都下载好.. MP3文件working..but图像和视频被破坏用j ...
- java写出文本文档乱码_对象流如何写出到文件以及为什么乱码
在写入对象文件的过程中,采用了txt文件,发现文件乱码,引发了思考. 首先需要理解好IO流是如何处理文件的. 1.ObjectOutputStream 对Java对象进行序列化处理,处理后的数据,不是 ...
- java io流文件损坏_java使用io流下载.docx. xlsx文件,出现文件损坏提示
介绍 在使用io流下载服务器上的资源文件时,出现以下提示:但是选择"是"后文件可以正常打开 参考 代码如下: [codesyntax lang="java"] ...
- 文件格式和扩展名不匹配.文件可能已损坏_自媒体良器:音频文件批处理,FFmpeg一行搞定!果断收藏...
引言 FFMpeg 是众多多媒体应用程序的核心,但该程序本身不具备一次转换多个文件的能力. 但也拦不住,FFMpeg 本身是命令行程序,可编写脚本,借助 Bash 轻松快速地构建自动化程序. 1 - ...
- 怎么打开avi文件文件损坏_什么是AVI文件(以及如何打开一个文件)?
怎么打开avi文件文件损坏 A file with the .avi file extension is an Audio Video Interleave file. AVI is a common ...
- java搜狐笔试题_记录一次搜狐面试(包括笔试题)
1.如何用一个div实现下图 css #demo{ width:120px; height: 120px; border:2px solid #333; border-radius: 20px; po ...
- java 判断视频是否损坏_内容研究(或如何判断您的内容是否损坏)
java 判断视频是否损坏 您的内容效果如何? (How well is your content working?) In the age of data-worship, most site ow ...
- mysql命令导出数据不完整_使用MySQL MySqldump命令导出数据时的注意事项
今天使用mysqldump命令备份数据的时候出现了一个问题. 一开始迁移 Discuz 7 论坛的 mysql 数据库时,采用 mysqldump 命令的时候一切顺利,但导入的时候却遇到了 ERROR ...
- Java利用注解实现配置动态公式并结合POI导出Excel
利用注解实现动态配置公式并结合POI导出Excel 实现思想 创建导出对象 创建使用注解类 创建封装导出对象属性类 创建测试类 创建ExcelUtil类 实现效果 实现思想 实施顾问提出导出Excel ...
最新文章
- Python基础:02数字
- [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)...
- 【Java 虚拟机原理】堆区 | Java VisualVM 工具
- 各种排序实现以及稳定性分析
- 14:IO之字符字节流
- 【云快讯】之五十五《IBM推出Data Warehouse数据仓库云服务》
- 乌龟吃鱼类 -python
- 性能优化总结(三):聚合SQL在GIX4中的应用
- nvidia-rapids︱cuDF与pandas一样的DataFrame库
- SQL语句的执行计划
- Axure RP最新授权码
- OFD文件解析流程(转)
- java 调用net remoting_获取 org.springframework.remoting.RemoteAccessException: 在进行调用时无法访问远程服务?...
- 三星s8刷机包android10版本,三星S8+刷机包(官方固件最新升级包v7.0)
- Mac 谷歌浏览器chrome恶意插件劫持Any search(TotalSearchToolbox)处理
- 计算机电源不能启动不了,电脑不开机,常见原因有哪些,怎么处理,黑屏怎么办...
- 用Java写一个水仙花数算法
- 数据治理之主数据管理MDM
- 路由器和交换机常见故障信息收集命令总结
- Python GraphQL
热门文章
- 2021年山东省安全员C证新版试题及山东省安全员C证考试总结
- 添加arcgi移动地图点位事件
- 给我一个放鞭炮动画的代码,使用C#执行
- 天津大学四川创新研究院正式揭牌,落户成都科学城
- [oeasy]python0101_尾声_PC_wintel_8080_诸神的黄昏_arm_riscv
- vb.net 高精度定时器 1ms级
- 记下默认端口为80的
- MonoDroid学习笔记(十二)—— 您有一条新短信息,请注意查收。状态栏提醒
- 绘图软件surfer中文使用教程:编辑等高线图时查看参考点
- mysql的扩容_MySQL的InnoDB的扩容