Java学习之word文档导出(POI处理word文档内容、页眉、页脚)
关键对象: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(); } }