java如何使用poi-tl在word模板里渲染多张图片

1、poi-tl官网地址
http://deepoove.com/poi-tl/

2、引入poi-tl的依赖

java 复制代码
	  <dependency>
         <groupId>com.deepoove</groupId>
         <artifactId>poi-tl</artifactId>
         <version>1.12.1</version>
      </dependency>

3、定义word模板

释义: ?为开始标签,/为结束标签,@picture为渲染每一个图片

4、Java测试代码

java 复制代码
@RequestMapping("/test")
@RestController
public class TestController {
	private static final String PICTURE_PATH = "D:\\test\\picture\\";

	@GetMapping("/download")
    public void download(HttpServletResponse response) throws IOException {
    	//定义存储集合
        Map<String, Object> pictureMap= new HashMap<>();
		//创建并得到图片集合,设置图片大小
        List<Map<String, PictureRenderData>> pictureList = createPictureList(100, 100);
        pictureMap.put("pictureList", pictureList);
		//通过XWPFTemplate处理
        XWPFTemplate document = XWPFTemplate.compile(new ClassPathResource("templates/test.docx").getFile()).render(pictureMap);
		//返回数据设置
        setResponseHeader(response);
		//输出流并关闭
        OutputStream os = response.getOutputStream();
        document.write(os);
        os.close();
    }

	private List<Map<String, PictureRenderData>> createPictureList(int width, int height) {
        List<Map<String, PictureRenderData>> list = new ArrayList<>();
		
		//添加多张图片到集合
        list.add(createPictureMap("Banner (1).jpg", width, height));
        list.add(createPictureMap("Banner (10).jpg", width, height));
        list.add(createPictureMap("Banner (100).jpg", width, height));

        return list;
    }

	private Map<String, PictureRenderData> createPictureMap(String pictureName, int width, int height) {
        Map<String, PictureRenderData> map = new HashMap<>();
        //创建PictureRenderData对象并设置其大小
        //Pictures还有其他方法,如Pictures.ofStream()流处理,可根据自己的需求及文档替换
        map.put("picture", Pictures.ofLocal(PICTURE_PATH + pictureName).size(width, height).create());
        return map;
    }

	private void setResponseHeader(HttpServletResponse response) {
        response.reset();
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition",
                "attachment;filename=picture_word_" + System.currentTimeMillis() + ".docx");
    }
}

5、测试结果

相关推荐
木井巳1 小时前
【动态规划: 线性dp】解码方法
java·算法·leetcode·动态规划·推荐算法
沙蒿同学8 小时前
不引 Ghostscript:我用纯 Go 给 PDF 做了一场「压缩手术」
前端·后端·github
缓慢更新9 小时前
审批的加签与会签:多人意见怎么合
android·java·数据库·低代码·rxjava
前进的李工10 小时前
飞书企业知识库设计+后端高频八股
数据库·redis·后端·mysql·性能优化·飞书·rag
yuniko-n10 小时前
【JUC】volatile 非原子性深入解析
java
sun_weitao10 小时前
极简版 MCP 工具实现方案
java·linux·服务器
金銀銅鐵11 小时前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
布吉岛的石头12 小时前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
大文说跨境12 小时前
防关联浏览器的指纹覆盖到什么程度:六类参数的实测与自检方法
java·指纹浏览器·tiktok运营
武子康12 小时前
Vercel Cache Reason:相同 MISS,怎样决定下一步查什么
人工智能·后端·agent