java word文档进行填充使用 ${xxx} 的形式


 

<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);
    }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM