<dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId> <version>1.0.6</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.10.1</version> </dependency> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId> <version>1.0.4</version> </dependency>
/** * 利用模板生成word文檔 * @param filedValueMap 對應的字段 key - value 形式, 如果value是 inputstream 我們認為是圖片, 並且是png的, 否則都會轉成string * @param inputStream 模板輸入流 * @param outputStream 輸出流 * @throws IOException * @throws InvalidFormatException */ public static void POIUtilsTemplate2Word(Map<String, Object> filedValueMap, InputStream inputStream, OutputStream outputStream) throws IOException, InvalidFormatException { final XWPFDocument document = new XWPFDocument(inputStream).getXWPFDocument(); List<XWPFParagraph> paragraphList = document.getParagraphs(); List<String> filedList = Lists.newArrayList(); List<String> valueList = Lists.newArrayList(); List<String> filedInputStream = Lists.newArrayList(); List<Object> valueInputStream = Lists.newArrayList(); filedValueMap.forEach((filed, value) -> { final String filedKey = String.format("${%s}", filed); if (value instanceof InputStream) { filedInputStream.add(filedKey); valueInputStream.add(value); } else { filedList.add(filedKey); valueList.add(String.valueOf(value)); } }); final String[] filedArray = filedList.toArray(new String[filedList.size()]); final String[] valueArray = valueList.toArray(new String[valueList.size()]); for (XWPFParagraph paragraph : paragraphList) { final List<XWPFRun> runs = paragraph.getRuns(); final String text = paragraph.getText(); String runText = StringUtils.replaceEach(text, filedArray, valueArray); if (CollectionUtils.size(runs) > 0) { // 為了 解決 POI 中 runs 分段錯誤問題, 他大爺的 for (int i = 0; i < runs.size(); i ++) { // 是否包含圖片 final int index = StringUtils.indexOfAny(text, filedInputStream.toArray(new String[filedInputStream.size()])); if (index > -1 && i == 0) { final XWPFRun run = runs.get(i); /** * 修改sonar問題,這個for循環只循環一次,所以直接取第一個 2020/06/05 */ run.addPicture((InputStream) valueInputStream.get(0), HSSFPicture.PICTURE_TYPE_PNG, "file", Units.toEMU(100), Units.toEMU(50)); // for (int filedIndex = 0; filedIndex < filedInputStream.size(); filedIndex++) // { // run.addPicture((InputStream) valueInputStream.get(filedIndex), // HSSFPicture.PICTURE_TYPE_PNG, // "file", Units.toEMU(100), Units.toEMU(50)); // break; // } } else { runs.get(i).setText(i == 0 ? runText : "", 0); } } } } document.write(outputStream); }