Apache-POI解析Word模板工具类

今天给大家带来一个Apache-POI的Word解析工具。

public class WordTemplateParse {
    public static Boolean generate(Map<String, String> data, InputStream tempFileStream, OutputStream targetFileStream) {
        try {
            // 加载磁盘的 temp.docx 文件
            XWPFDocument document = new XWPFDocument(tempFileStream);

            // 解析文档中的【段落】的插值 ${..}
            List<XWPFParagraph> paragraphs = document.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
                String text = paragraph.getText();
                // 如果该单元格为空就遍历下一个
                if (text == null || "".equals(text)) {
                    continue;
                }

                // 得到解析 ${...} 后的内容
                String newText = replaceByMap(text, null, data);
                // 判断值是否改变,如果没有改变就不做处理
                if (!text.equals(newText)) {
                    int runSize = paragraph.getRuns().size();
                    // 清空该段落所有值
                    for (int i = 0; i < runSize; i++) {
                        paragraph.removeRun(i);
                    }

                    XWPFRun run = paragraph.createRun();
                    run.setText(newText);
                }

            }

            // 解析文档中【表格】的插值 ${..}
            // 获取文档中的表格
            List<XWPFTable> tables = document.getTables();
            for (XWPFTable table : tables) {
                // 得到所有行的集合并遍历
                List<XWPFTableRow> rows = table.getRows();
                for (XWPFTableRow row : rows) {
                    // 得到所有列的集合并遍历
                    List<XWPFTableCell> cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        // 获取整个单元格的值
                        String text = cell.getText();
                        // 如果该单元格为空就遍历下一个
                        if (text == null || "".equals(text)) {
                            continue;
                        }

                        // 得到解析 ${...} 后的内容
                        String newText = replaceByMap(text, null, data);
                        // 判断值是否改变,如果没有改变就不做处理
                        if (!text.equals(newText)) {
                            // 清空单元格内容
                            int paragraphsNums = cell.getParagraphs().size();
                            for (int i = 0; i < paragraphsNums; i++) {
                                cell.removeParagraph(i);
                            }
                            cell.setText(newText);
                        }
                    }
                }
            }

            // 将文档写入目标文件中
            document.write(targetFileStream);
            // 关闭流
            tempFileStream.close();
            targetFileStream.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    // 如果根据正则表达式规则匹配成功则替换,否则返回原值
    private static String replaceByMap(String content, String regex, Map<String, String> map) {
        // 匹配插值 ${...}
        if (regex == null) {
            regex = "\\$\\{[\\w\\W]+\\}";
        }

        // 初始化正则
        Pattern p = Pattern.compile(regex);
        Matcher matcher = p.matcher(content);

        // 找到匹配的内容的 key
        if (matcher.find()) {
            // 提前key值
            String matchContent = matcher.group(0);
            int start = matchContent.indexOf("{");
            int end = matchContent.indexOf("}");

            // 获取key
            String key = matchContent.substring(start + 1, end);

            // 从map中取出key的值
            String value = map.get(key);
            if (value == null) {
                return content;
            }

            // 得到替换后的值
            String newContent = matcher.replaceAll(value);
            return newContent;
        }

        // 没有匹配到,返回原值
        return content;
    }

}

编写一个测试类:

@Test
    public void test01() throws FileNotFoundException {
        // 数据
        TreeMap<String, String> data = new TreeMap<String, String>();
        data.put("id", "0001");
        data.put("number", "2");
        data.put("date", "2020-10-21");
        data.put("payee", "张三");
        data.put("user_of_payment", "设备维修");
        data.put("capitalization_amount", "壹佰元整");
        data.put("lowercase_amount", "100");
        data.put("title", "这是凭据的标题==测试");
        data.put("footer", "这是底部的一段文本==测试");

        // 加载模型【模型】
        FileInputStream fis = new FileInputStream("src/main/resources/temp.docx");

        // 输出位置【输出】
        FileOutputStream fos = new FileOutputStream("src/main/resources/new_temp.docx");

        Boolean generate = WordTemplateParse.generate(data, fis, fos);
        System.out.println(generate);
    }
  • 这是一个Word的模板:
    在这里插入图片描述
  • 这是工具解析${…}后的样子:
    在这里插入图片描述

源代码分享
链接:https://pan.baidu.com/s/1U1E9frZeIb9dOVCM1XWL2Q
提取码:nlqd

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用easy-poi导出word模板中的表格时,需要按照以下步骤进行操作。 首先,我们需要准备一个word模板文件,其中包含了我们想要导出的表格的样式和布局。可以使用Microsoft Word或其他支持word格式的编辑软件创建和编辑模板。 接下来,我们需要使用easy-poi的API来读取和处理模板文件。首先,我们需要创建一个`TemplateExportParams`对象,指定模板文件的路径。 然后,我们可以通过调用`ExcelExportUtil.exportWord`方法来根据模板生成word文件。在导出过程中,我们可以使用`Map`或`List<Map>`对象作为数据源,用于填充模板中的表格单元格。 对于简单的表格,我们可以使用`Map`对象来存储数据。其中,键对应模板中的字段名,值对应字段要显示的数据。如果我们需要填充多行表格,可以使用`List<Map>`来存储多个`Map`对象。 在代码中,我们可以使用以下语句来导出word文件: ```java String templatePath = "模板文件路径"; String outputPath = "导出文件保存路径"; TemplateExportParams exportParams = new TemplateExportParams(templatePath); Map<String, Object> map = new HashMap<>(); map.put("表格数据", 数据源); Workbook workbook = ExcelExportUtil.exportWord(exportParams, map); FileOutputStream fos = new FileOutputStream(outputPath); workbook.write(fos); fos.close(); ``` 其中,"表格数据"是模板中指定的字段名,数据源是存储表格数据的`Map`或`List<Map>`对象。 最后,我们可以保存生成的word文件到指定的输出路径。通过调用`workbook.write`方法将`Workbook`对象写入到输出流中,即可保存为word文件。 以上就是使用easy-poi导出word模板表格的主要步骤。通过简单配置模板和填充数据,我们可以轻松地生成符合需要的word文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值