poi-tl——Word模板引擎应用

poi-tl(poi template language)是基于Apache POI的Word模板引擎。纯Java组件,跨平台,代码短小精悍,通过插件机制使其具有高度扩展性。支持DOCX格式的Word模板。

关于poi-tl的入门介绍在官网比较清晰,http://deepoove.com/poi-tl/

下面介绍poi-tl一些其他的需求处理


1,在Word中生成的图片固定原图片比例,防止图片变形

图片模板{{@var}}PictureRenderData 数据模型。

下面使用到生成图片方法的是官方的 // 本地图片byte数据,http://deepoove.com/poi-tl/#_图片模板var

// 本地图片byte数据
byte[] localByteArray = BytePictureUtils.getLocalByteArray(new File("./logo.png"));
put("localBytePicture", new PictureRenderData(100, 120, ".png", localByteArray));

 按原图片比例生成图片,用到ImageIO工具类,https://blog.csdn.net/weixin_41888813/article/details/85043969

File picture = new File(myPath);
byte[] TestPic = BytePictureUtils.getLocalByteArray(picture);
// 获取图片比例
BufferedImage sourceImg = ImageIO.read(new FileInputStream(picture));
params.put("myImg", new PictureRenderData(600, ((sourceImg.getHeight()*600)/sourceImg.getWidth()), ".png", TestPic));
}

 

 2,同一行左右各分布一张图片

      文档模板{{+var}}DocxRenderData 数据模型,可以是另一个docx文档的合并,或者是数据集合针对同一个模板的多个渲染结果的合并。也就是子模板可用于在主模板中循环,但每一次循环的子模板会自动换行,要实现左右分布,需要改动子模板。

子模板(zi.docx),这里是一个隐藏了边框的一行两列的表格

主模板中{{+zi}}即可嵌入子模板

SegmentData实体类

@Data
public class SegmentData {
    private String imgName;
    private PictureRenderData img;

    private String imgName1;
    private PictureRenderData img1;
}

核心代码

注:

  • 本地测试没问题,打包后应该会有问题,会出现文件找不到,因为classPathResource.getFile()方法会出问题
  • 可以尝试使用临时文件,用于参数传入到DocxRenderData数据模型
                    SegmentData s = new SegmentData();
                    for(int i=1; i<=附件图片的List.size(); i++){
                        File picture = new File(文件的本地保存路径);
                        byte[] localByteArray = BytePictureUtils.getLocalByteArray(picture);
                        // 获取图片比例
                        BufferedImage sourceImg =ImageIO.read(new FileInputStream(picture));
                        PictureRenderData prd = new PictureRenderData(250, (sourceImg.getHeight()*250)/sourceImg.getWidth(), ".png", localByteArray);
                        if(i%2 != 0){
                            s.setImgName(附件图片的List.get(i-1).getFilename());
                            s.setMicroscopeImg(prd);
                        } else{
                            s.setImgName1(附件图片的List.get(i-1).getFilename());
                            s.setMicroscopeImg1(prd);
                        }
                        if(i%2 == 0){
                            segments.add(s);
                            s = new SegmentData();
                        }else if(i == 附件图片的List.size() && 附件图片的List.size()%2 != 0){
                            segments.add(s);
                        }
                    }
                    ClassPathResource classPathResource  = new ClassPathResource("./template/word/zi.docx");
                    DocxRenderData segment = new DocxRenderData(classPathResource.getFile(), segments);
                    params.put("zi", segment);

 

 

 


版权声明:本文为weixin_41888813原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。