首页 > 其他分享 >每周一个技能点:POI操作word文档实现替换符替换文字

每周一个技能点:POI操作word文档实现替换符替换文字

时间:2024-07-06 17:58:10浏览次数:22  
标签:word String list replaceValue POI ReplaceParam 替换 replaceParam

引入依赖

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.0</version>
        </dependency>

具体实现

准备替换实体:

@Data
@Builder
public class ReplaceParam {


    //占位符
    private String placeholder;
    //替换值
    private String replaceValue;
    //默认值
    private String defaultValue;
    //文字大小
    private Integer size;
    //字体样式
    private String fontFamily;
    //字体颜色
    private String color;
    //..........
}

具体实现:



public class POIWordUtil {

    public static File replace( File sourceFile,  File targetFile, List<ReplaceParam> replaceParams) {
        //创建文档
        XWPFDocument xwpfDocument = DocUtil.create(sourceFile);
        try (FileOutputStream outputStream = new FileOutputStream(targetFile)) {
            Map<String, ReplaceParam> replaceParamMap = replaceParams.stream().collect(Collectors.toMap(ReplaceParam::getPlaceholder, Function.identity()));
            for (IBodyElement iBodyElement : xwpfDocument.getBodyElements()) {
                //段落
                if (iBodyElement instanceof XWPFParagraph) {
                    XWPFParagraph xwpfParagraph = (XWPFParagraph) iBodyElement;
                    replaceText(replaceParamMap, xwpfParagraph);
                }
                //表格
                if (iBodyElement instanceof XWPFTable) {
                    //多层表格则需要一直嵌套
                    replaceTables(replaceParamMap,(XWPFTable)iBodyElement);
                }
            }
            xwpfDocument.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return targetFile;
    }

    /**
     * 处理表格问题,可能嵌套表格
     */
    private static void replaceTables(Map<String, ReplaceParam> map, XWPFTable xwpfTable) {
        for (XWPFTableRow row : xwpfTable.getRows()) {
            for (XWPFTableCell cell : row.getTableCells()) {
                List<IBodyElement> bodyElements = cell.getBodyElements();
                for (IBodyElement bodyElement : bodyElements) {
                    //表格中存在段落则进行段落替换
                    if (bodyElement instanceof XWPFParagraph) {
                        replaceText(map,  (XWPFParagraph) bodyElement);
                    }
                    if (bodyElement instanceof XWPFTable) {
                        replaceTables(map, (XWPFTable)bodyElement);
                    }
                }
            }
        }
    }

    /**
     * 文本替换--样式保留为原来的样式
     */
    private static void replaceText(Map<String, ReplaceParam> replaceParamMap, XWPFParagraph xwpfParagraph) {
        String text = xwpfParagraph.getParagraphText();
        if (StrUtil.isNotBlank(text) && text.contains("${")) {
            List<XWPFRun> runs = xwpfParagraph.getRuns();
            for (XWPFRun run : runs) {
                //替换文字和样式
                changeValue(run, replaceParamMap);
            }
        }
    }

    /**
     * 文字或者样式替换
     */
    private static void changeValue(XWPFRun run, Map<String, ReplaceParam> replaceParamMap) {
        Set<Map.Entry<String, ReplaceParam>> textSets = replaceParamMap.entrySet();
        for (Map.Entry<String, ReplaceParam> textSet : textSets) {
            //匹配模板与替换值 格式${key}
            String key =  textSet.getKey() ;
            ReplaceParam replaceParam = textSet.getValue();
            if (run.toString().contains(key)) {
                //替换值
                String replaceValue = replaceParam.getReplaceValue() == null ? replaceParam.getDefaultValue() : replaceParam.getReplaceValue();
                String value = run.toString().replace(key, replaceValue);
                run.setText(value,0);
                if (replaceParam.getSize() != null){
                    run.setFontSize(replaceParam.getSize());
                }
                if (replaceParam.getColor() != null){
                    run.setColor(replaceParam.getColor());
                }
                if (replaceParam.getFontFamily() != null){
                    run.setFontFamily(replaceParam.getFontFamily());
                }
                //...........................
            }
        }
    }


    public static void main(String[] args) {
        ReplaceParam param1 = ReplaceParam.builder().placeholder("${add1}").replaceValue("星期一").size(40).build();
        ReplaceParam param2 = ReplaceParam.builder().placeholder("${add2}").replaceValue("星期二").build();
        ReplaceParam param3 = ReplaceParam.builder().placeholder("${add3}").replaceValue("星期三").size(30).build();
        ReplaceParam param4 = ReplaceParam.builder().placeholder("${add4}").replaceValue("星期四").size(22).build();
        ReplaceParam param5 = ReplaceParam.builder().placeholder("${add5}").replaceValue("星期五").build();
        ReplaceParam param6 = ReplaceParam.builder().placeholder("${add6}").replaceValue("星期六").build();
        ReplaceParam param7 = ReplaceParam.builder().placeholder("${add7}").replaceValue("星期日").build();

        List<ReplaceParam> list = new ArrayList<>();
        list.add(param1);
        list.add(param2);
        list.add(param3);
        list.add(param4);
        list.add(param5);
        list.add(param6);
        list.add(param7);
        File sourceFile = new File("C:\\Users\\a\\Desktop\\study\\测试替换文档.docx");
        File targetFile = new File("C:\\Users\\a\\Desktop\\study\\替换文档.docx");
         POIWordUtil.replace(sourceFile, targetFile, list);

    }
}

原始模板:

替换后:

注意

如果出现${替换符}出现没在一起的情况,像这种:

解决办法:

把 ${替换符} 先在记事本上连续写出来,再粘贴到文档中

标签:word,String,list,replaceValue,POI,ReplaceParam,替换,replaceParam
From: https://blog.csdn.net/m0_73363097/article/details/140233145

相关文章

  • [POI2015] WYC 题解
    [POI2015]WYC显然矩阵乘法发现点数和边权非常小,所以可以考虑拆点把每个点拆为\(u_1\),\(u_2\),\(u_3\),初始:\(u_1\tou_2\),\(u_2\tou_3\),每一条加边:\(u+(w-1)\timesn\tov\)因为\(k\)非常大,所以考虑倍增优化注意:答案会爆longlong,需要使用unsignedlonglong//Pro......
  • 用免费WordPress和Cloudflare打造媲美收费服务的网站
    你是否曾因为网站搭建的高昂费用而犹豫不决?别担心,我来告诉你一个几乎零成本的解决方案,让你轻松拥有一个功能强大的网站。通过免费域名、免费PHP主机、WordPress程序和CloudflareCDN服务的组合,你可以打造出一个媲美收费服务的网站。首先,你需要一个域名。在lita.eu.org注册免费......
  • 摸鱼大数据——Spark Core——缓存和checkpoint
    1、RDD的缓存当RDD被重复使用,或者计算该RDD比较容易出错,而且需要消耗比较多的资源和时间的时候,我们就可以将该RDD缓存起来。​主要作用:提升Spark程序的计算效率注意事项:RDD的缓存可以存储在内存或者是磁盘上,甚至可以存储在Executor进程的堆外内存中。主要是放在内存......
  • 外挂级OCR神器:免费文档解析、表格识别、手写识别、古籍识别、PDF转Word
    TextInTools是一款免费的在线OCR工具,支持快速准确的文字和表格识别,手写、古籍识别,提供PDF转Markdown大模型辅助工具,同时支持PDF、WORD、EXCEL、JPG、PPT等各类格式文件的转化。TextInTools特点免费:所有产品提供每日200页免费额度,覆盖日常使用需求。方便:无需下载安装,PC端......
  • 从零开始使用WordPress搭建个人网站并一键发布公网详细教程
    文章目录前言1.搭建网站:安装WordPress2.搭建网站:创建WordPress数据库3.搭建网站:安装相对URL插件4.搭建网站:内网穿透发布网站4.1命令行方式:4.2.配置wordpress公网地址5.固定WordPress公网地址5.1.固定地址访问WordPress前言本文主要介绍如何在LinuxUbuntu......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 word文件并另存HTML或
    国产linux系统(银河麒麟,统信uos)使用PageOffice国产版在线打开pdf文件PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)芯片架构。查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的......
  • 代码随想录算法训练营第八天|344.反转字符串、541.反转字符串Ⅱ、54.替换数字(卡码网
    344简单写个循环1classSolution{2public:3voidreverseString(vector<char>&s){4chartmp;5intlen=s.size();6for(inti=0;i<len/2;i++){7tmp=s[i];8s[i]=s[len-......
  • 批量替换doc、xls、xlsx文件内容
    docx类:importosfromdocximportDocumentfromopenpyxlimportload_workbookdefreplace_string_in_docx(file_path,old_string,new_string):doc=Document(file_path)forparagraphindoc.paragraphs:ifold_stringinparagraph.text:......
  • 生成word文档,内容为表格(第一次实操)
    packagecom.cqbb.common.utils.poi;importcom.alibaba.fastjson2.JSONArray;importcom.alibaba.fastjson2.JSONObject;importcom.cqbb.common.config.BBKJConfig;importorg.apache.commons.io.IOUtils;importorg.apache.poi.openxml4j.exceptions.InvalidFormatExceptio......
  • Java 中的字符串替换方法详解:replace, replaceAll 和 replaceFirst
    在Java中,字符串的替换是一种常见的操作,特别是在处理文本和格式化输出时。Java提供了几种不同的方法来实现字符串替换,其中包括replace,replaceAll和replaceFirst。本文将详细讨论这些方法的用法、区别以及示例。1.replace(CharSequencetarget,CharSequencereplaceme......