poi动态操作word填充数据,操作docx,转成pdf
场景:请求接口,将数据输出成pdf
思路:一个word模板,用请求的数据填充,生成新的word,再将新word转成pdf
- 准备jar包和dll ,jacob.jar;jacob-1.18-x64.dll,jacob-1.18-x86.dll;
- jar包下载链接:https://pan.baidu.com/s/16n7zYR4hCH03LyalYVNTQw
提取码:d461
请求数据:
{
“CF_COMPANY”: “个人股份”,
“DEFAULT_EFFECTIVE_DATE”: “2017年06月26日”,
“JE_NUMBER”: “1706003980”,
“CP_ATTACH_NUM”: “1张”,
“CP_DOC_NUM”: " ",
“SERIAL”: “10003998”,
“JE_SOURCE”: “人工”,
“JE_CATEGORY”: “记账”,
“CURRENCY_CODE”: “CNY”,
“CURRENCY_CONVERSION_RATE”: “1.0000”,
“HEADER_DESC”: “山海自有归期,风雨自有相逢。意难平终将和解,万事终将如意”,
“CF_CAP_SUM”: “贰佰万圆整”,
“CS_ACCOUNTED_DR”: “2,000,000.00”,
“CS_ACCOUNTED_CR”: “2,000,000.00”,
“MANAGER_NAME”: “张三”,
“POST_NAME”: “李四”,
“CP_CREATED_BY”: “王五”,
“items”: [{
“ENTERED_DR”: “2,000,000.00”,
“ACCOUNTED_DR”: “2,000,000.00”,
“ENTERED_CR”: “”,
“ACCOUNTED_CR”: “”,
“LINE_DESC”: “山海自有归期,风雨自有相逢。意难平终将和解,万事终将如意”,
“CF_ACCOUNT_DESC”: “…真正的强大不是忘记,而是接受,接受分道扬镳,接受内心的不安接受不完美的自己,…”,
“CF_ACCOUNT_VALUE”: “0.100201010000.B10102.0”
},
{
“ENTERED_DR”: “”,
“ACCOUNTED_DR”: “”,
“ENTERED_CR”: “2,000,000.00”,
“ACCOUNTED_CR”: “2,000,000.00”,
“LINE_DESC”: “接受自己的不安困惑和焦虑和遗憾,调整好自己的状态,找到前进的力量,成为更好的自己”,
“CF_ACCOUNT_DESC”: “…接受自己…”,
“CF_ACCOUNT_VALUE”: “0.224198000000.0.0”
}
]
}
word模板:
实现效果:
参考:https://blog.csdn.net/weixin_43674794/article/details/103101221
代码
package com.test.Electronic.util;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.shuying.saidi.Electronic.ElectronicRequest;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.xwpf.usermodel.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;
/**
* 通过word模板生成新的word工具类
*
* @author zhiheng
*/
public class WorderToNewWordUtils {
/**
* 根据模板生成新word文档
* 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
*
* @param inputUrl 模板存放地址
* @param textMap 需要替换的信息集合
* @param tableList 需要插入的表格信息集合
* @return 成功返回true, 失败返回false
*/
public static boolean changWord(String inputUrl, String outputUrl,
Map<String, String> textMap, List<String[]> tableList) {
//模板转换默认成功
boolean changeFlag = true;
try {
//获取docx解析对象
XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl));
//解析替换文本段落对象
WorderToNewWordUtils.changeText(document, textMap);
//解析替换表格对象
WorderToNewWordUtils.changeTable(document, textMap, tableList);
//生成新的word
File file = new File(outputUrl);
FileOutputStream stream = new FileOutputStream(file);
document.write(stream);
stream.close();
} catch (IOException e) {
e.printStackTrace();
changeFlag = false;
}
return changeFlag;
}
/**
* 替换段落文本
*
* @param document docx解析对象
* @param textMap 需要替换的信息集合
*/
public static void changeText(XWPFDocument document, Map<String, String> textMap) {
//获取段落集合
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
//判断此段落时候需要进行替换
String text = paragraph.getText();
if (checkText(text)) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
//替换模板原来位置
run.setText(changeValue(run.toString(), textMap), 0);
}
}
}
}
/**
* 替换表格对象方法
*
* @param document docx解析对象
* @param textMap 需要替换的信息集合
* @param tableList 需要插入的表格信息集合
*/
public static void changeTable(XWPFDocument document, Map<String, String> textMap,
List<String[]> tableList) {
//获取表格对象集合
List<XWPFTable> tables = document.getTables();
for (int i = 0; i