关键对象:Poi-tl Documentation
学习路径:http://deepoove.com/poi-tl/#_why_poi_tl
代码Demo:
public static void main(String[] args) {
HashMap<String, Object> dataMap = new HashMap<>();
Map<String, Object> data = new HashMap<String, Object>();
ArrayList<Map<String, Object>> dataList = new ArrayList<>();
//封装数据
data.put("username", "demo");
data.put("password", "001");
data.put("head", Pictures.ofLocal("C:\\Users\\Pictures\\Saved Pictures\\ais.jpg")
.size(35, 35).create());
dataList.add(data);
//key要和模板中的开始结束标签保持一致
dataMap.put("wordExportTemp", dataList);
try {
String res = wordUtil.tempRender(dataMap);
System.out.println(res);
} catch (Exception e) {
System.out.println("Fail");
}
}
public class wordUtil {
public static String tempRender(HashMap<String, Object> dataMap) throws Exception {
//模板文件
String inPut = "D:\\tempword\\data\\wordFile.docx";
//生成文件
String outPut = "D:\\tempword\\data\\2021-09-15\\exportWord.docx";
//获取模板文件数据
XWPFWordExtractor extractor = new XWPFWordExtractor(OPCPackage.open(new FileInputStream(inPut)));
//获取String型模板数据
//System.out.println(extractor.getText());
FileOutputStream outputStream = new FileOutputStream(outPut);
//用来配置常用的设置
ConfigureBuilder builder = Configure.builder();
//用默认的方式抛出异常
builder.useDefaultEL(true);
//匹配除了标签前后缀外的任意字符
builder.buildGrammerRegex(RegexUtils.createGeneral("{{", "}}"));
//创建结果对象
XWPFTemplate docx = XWPFTemplate.compile(inPut,builder.build());
//数据渲染
docx.render(dataMap);
//数据写出
docx.write(outputStream);
outputStream.flush();
outputStream.close();
docx.close();
return "OK";
}
}
模板:
注意:{{?wordExportTemp}} 中的“wordExportTemp”要和封装数据Map的“key"保持一致!
结果
补充(word文档页眉、页脚的处理):
public static void renderTempHeaderAndFooter(String fileName, String dir, Map<String, Object> dataMap) throws IOException {
FileOutputStream out = null;
XWPFDocument xwpfDocument = null;
//增加页脚处理
try {
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
file = new File(dir + File.separator + fileName);
if (!file.exists()) {
new Throwable("模板不存在");
}
xwpfDocument = new XWPFDocument(new FileInputStream(file));
//如果dataMap里存的不是List可以省略这步
List<Map<String, Object>> listInfo = (List<Map<String, Object>>) dataMap.get("listdata");
List<XWPFFooter> footerList = xwpfDocument.getFooterList();
for (XWPFFooter footer : footerList) {
List<XWPFParagraph> paragraphs = footer.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
List<XWPFRun> runs = paragraph.getRuns();
for (int i = 0; i < runs.size(); i++) {
//因为word每页的页眉页脚都是相同的,所以只取一条数据只能能渲染一次
Map<String, Object> map = listInfo.get(0);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
if (runs.get(i).getText(runs.get(i).getTextPosition()) != null && runs.get(i).getText(runs.get(i).getTextPosition()).contains(key)) {
String replace = runs.get(i).getText(runs.get(i).getTextPosition()).replace(runs.get(i).getText(runs.get(i).getTextPosition()), map.get(key).toString());
runs.get(i).setText(replace, 0);
}
}
}
}
}
//增加页眉处理
List<XWPFHeader> headerList = xwpfDocument.getHeaderList();
for (XWPFHeader header : headerList) {
List<XWPFParagraph> paragraphs = header.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
List<XWPFRun> runs = paragraph.getRuns();
for (int i = 0; i < runs.size(); i++) {
//因为word每页的页眉页脚都是相同的,所以只取一条数据只能能渲染一次
Map<String, Object> map = listInfo.get(0);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
if (runs.get(i).getText(runs.get(i).getTextPosition()) != null && runs.get(i).getText(runs.get(i).getTextPosition()).contains(key)) {
String replace = runs.get(i).getText(runs.get(i).getTextPosition()).replace(runs.get(i).getText(runs.get(i).getTextPosition()), map.get(key).toString());
runs.get(i).setText(replace, 0);
}
}
}
}
}
//渲染后需要保存文件
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
xwpfDocument.write(byteArrayOutputStream);
out = new FileOutputStream(dir + File.separator + fileName);
out.write(byteArrayOutputStream.toByteArray());
out.flush();
out.close();
xwpfDocument.close();
} catch (Exception e) {
log.info("renderTempFooter_failed:" + e.getMessage());
} finally {
out.flush();
out.close();
xwpfDocument.close();
}
}