关于使用poi-tl读取本地图片,转为base64编码批量插入word的解决方法

解决poi-tl报错的问题

com.deepoove.poi.exception.ResolverException: Mismatched start/end tags: No start mark found for end mark {{/imgList}}

我这边模板文件很简单,主要就是区分标签,不要使用错误的标签,具体可看我的上一篇blog,

《poi-tl的AI幻觉:为什么所有模型都在教我用{{#}}标签?》

1.模板文件很简单,如下图所示:
2.模板直接复制即可
XML 复制代码
{{v1}}
{{v2}}
{{v3}}
{{?imgList}}
{{@picture}}
{{/imgList}}
{{v4}}
{{v5}}
{{v6}}
3.这边直接贴一下代码
java 复制代码
    @GetMapping("/createWord")
    @ApiOperation(value = "创建报告demo")
    public Result createWord() {
        List<String> imgList = new LinkedList<>();
        for (int i = 0; i < 5; i++) {
            String jpgPath = "E:\\demo\\20251219\\1234.jpg";
            File file = new File(jpgPath);
            if (!file.exists()) {
                throw new RuntimeException("文件不存在");
            }
            // 验证是否为JPG文件
            String lowerPath = jpgPath.toLowerCase();
            if (!lowerPath.endsWith(".jpg") && !lowerPath.endsWith(".jpeg")) {
                throw new RuntimeException("文件不是jpg/jpeg格式: " + jpgPath);
            }
            // 读取文件为字节数组
            try (FileInputStream fis = new FileInputStream(file)) {
                byte[] jpgBytes = new byte[(int) file.length()];
                fis.read(jpgBytes);
                // 转换为Base64字符串
                imgList.add("data:image/jpeg;base64," + Base64.getEncoder().encodeToString(jpgBytes));
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        try {
            createWordProcess(imgList);
        } catch (IOException e) {
            return Result.error("Word文档创建失败");
        }
        return Result.success();
    }

    /**
     * 创建Word文档过程
     *
     * @param imgList 图片列表
     */
    private void createWordProcess(List<String> imgList) throws IOException {
        // 准备数据模型
        Map<String, Object> dataModel = new HashMap<>();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        dataModel.put("v1", "今天是:" + dateFormat.format(new Date()));
        dataModel.put("v2", "这是一个Base64编码图片批量插入的测试方法");
        dataModel.put("v3", "图片如下:");
        dataModel.put("v4", "谢谢观看!");
        dataModel.put("v5", "谢谢观看!!");
        dataModel.put("v6", "谢谢观看!!!");
        List<Map<String, Object>> pictures = new ArrayList<>();
        for (String imageData : imgList) {
            // 创建图片Map
            Map<String, Object> pictureMap = new HashMap<>();
            // 创建图片数据
            PictureRenderData picture;
            if (imageData.startsWith("data:image")) {
                // 已经是完整的data URL格式,直接使用
                if (imageData.contains("/png")) {
                    picture = Pictures.ofBase64(imageData, PictureType.PNG)
                            .fitSize()
                            .create();
                } else {
                    picture = Pictures.ofBase64(imageData, PictureType.JPEG)
                            .fitSize()
                            .create();
                }
            } else if (imageData.startsWith("/")) {
                // 如果是文件路径,则从文件读取
                picture = Pictures.ofLocal(imageData)
                        .fitSize()
                        .create();
            } else {
                // 处理纯base64数据
                if (imageData.startsWith("iVBORw0KGgo")) {
                    picture = Pictures.ofBase64("data:image/png;base64," + imageData, PictureType.PNG)
                            //可以设置尺度
//                            .size(200,100)
                            .fitSize()
                            .create();
                } else {
                    // JPEG 默认处理
                    picture = Pictures.ofBase64("data:image/jpeg;base64," + imageData, PictureType.JPEG)
                            .fitSize()
                            .create();
                }
            }
            // 图片中需要加 该名称
            pictureMap.put("picture", picture);
            pictures.add(pictureMap);
        }

        // 放入数据模型
        dataModel.put("imgList", pictures);

        String uuid = GeneralUtil.getUUID();
        String fileName = uuid + ".docx";
        String filePath = "E:\\demo\\20251219\\" + fileName;
        InputStream in = Files.newInputStream(Paths.get("E:\\demo\\20251219\\demo.docx"));
        XWPFTemplate template = XWPFTemplate.compile(in).render(dataModel);
        template.writeAndClose(Files.newOutputStream(Paths.get(filePath)));
    }
4.查看下打印的结果吧
5.下面实验以下错误的标签
示例一

出现错误

com.deepoove.poi.exception.ResolverException: Mismatched start/end tags: No start mark found for end mark {{/imgList}}

示例二:
相关推荐
·薯条大王1 天前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO1 天前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆1 天前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光1 天前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林1 天前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu1 天前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官1 天前
Sa-Token和Spring Security对比
java·后端·spring
小当家.1051 天前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计
geminigoth1 天前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring