Apache POI根据模板生成word文档 .doc格式(解决循环中换行;spring boot 打包后 jar文件后读取不到模板资源问题)

本文以解决问题为主,就不对Apache POI做过多解释,感兴趣可自行搜索。如果不介意使用xml作为模板文件生成word文档,推荐使用freemark,但是生成的word上传后可能会出现格式问题不支持预览,因为freemark生成的word实质上还是xml格式,预览的时候是xml文件(不兼容openoffice或liboffice),正是为解决此问题,使用Apache POI生成word。

1.pom.xml

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>3.17</version>
</dependency>

2.创建目标模板文件,命名为template.doc,放置在resource/templates/template.doc

用${}来标记要替换的字段,例如${createTime}是将createTime替换成真实的创建时间

3.数据模型,包含具体数据的map对象

由于我这里是导出聊天记录,所以会需要进行格式处理,去掉文本中的html标签和防止字符转义, 

String str = StringEscapeUtils.unescapeHtml(jsonObject.getString("payload").replaceAll("</?[^>]+>", ""));

这一句是为了拼接会议内容,由于会议内容是list数组,而模板只有一个${chatRecordList}用来替换,所以需要先将数据拼接好。格式:序号、姓名:聊天内容

我还在后面拼了一个${newline},这个拼接内容命名看个人喜欢,目的是为了后面替换为换行。

String record = i+"、"+messageList.get(i).getSenderName()+"

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在使用`org.apache.poi.xwpf.usermodel.XWPFTableCell`读取Word文档表格列的文字时,大小写发生了改变,可能是因为读取时未保留原始的字符格式解决这个问题的方法是使用`run.getText()`方法获取每个单元格的文字,而不是直接使用`cell.getText()`方法。下面是一个示例代码: ```java import org.apache.poi.xwpf.usermodel.*; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class WordTableReader { public static void main(String[] args) { try { // 读取Word文档 FileInputStream fileInputStream = new FileInputStream("input.docx"); XWPFDocument document = new XWPFDocument(fileInputStream); fileInputStream.close(); // 获取第一个表格 XWPFTable table = document.getTables().get(0); // 假设文档只有一个表格 // 遍历表格内容 for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { for (XWPFParagraph paragraph : cell.getParagraphs()) { for (XWPFRun run : paragraph.getRuns()) { String text = run.getText(0); // 在这里处理单元格文本 // 例如,可以将text.toLowerCase()转为小写或text.toUpperCase()转为大写 System.out.println(text); } } } } System.out.println("表格内容读取成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个示例,我们遍历了表格的每个单元格,并使用嵌套的循环遍历单元格的段落、运和文本。通过使用`run.getText(0)`方法获取每个运对象的文本,我们可以保留原始的字符格式。 可以根据需要对单元格文本进任何操作,例如转为小写或大写,然后进进一步处理。 请确保在代码引入了正确的POI库以及其他所需的依赖项,并且在代码导入了正确的类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值