Jxls导出图片
博客专区 > 寒松 的博客 > 博客详情
Jxls导出图片
寒松 发表于1年前
Jxls导出图片
  • 发表于 1年前
  • 阅读 225
  • 收藏 3
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

Jxls导出复杂的excel表格, 包含图片,用java编码去写样式,插入图片太麻烦, 想到使用模版引擎去生成excel表格。

首先是freemarker,遇到几点问题,不能符合要求

  1. excel另存xml插入,无法插入图片
  2. 使用html模版另存xml可以插入图片,尝试后发现只能使用在线的图片地址,即使使用image base64也无法显示,base64 结尾改成.html就可以正常显示图片,还有一个问题是在打开的excel时会提醒打开的文件格式不是excel文档.

Jxls

网上各种搜索,发现jxls可以使用批注的方式插入图片, 但在循环输出的时候碰到了一个严重的缺陷, 插入图片到单元格时会出问题, 这在循环的时候会产生空行的现象

如下:

ps:出现问题的时候没想到要把爆坑,图片是其他碰到同样问题的同学发的贴,也是该帖道出如何解决问题,感谢:) 原帖传送门

jxls的插入图片的一个缺陷, 后来找到需要修改ImageCommand类的public Size applyAt(CellRef cellRef, Context context)   问题点传送门  解决方法传送门

代码如下

    public Size applyAt(CellRef cellRef, Context context) {
        if( area == null ){
            throw new IllegalArgumentException("No area is defined for image command");
        }
        Transformer transformer = getTransformer();
//       自定义image size
        Size imageAnchorAreaSize = new Size(area.getSize().getWidth() +1, area.getSize().getHeight() +1);
        AreaRef imageAnchorArea = new AreaRef(cellRef, imageAnchorAreaSize);
        byte[] imgBytes = imageBytes;
        if( src != null ){
            Object imgObj = getTransformationConfig().getExpressionEvaluator().evaluate(src, context.toMap());
            if( !(imgObj instanceof byte[]) ){
                throw new IllegalArgumentException("src value must contain image bytes (byte[])");
            }
            imgBytes = (byte[]) imgObj;
        }
        transformer.addImage(imageAnchorArea, imgBytes, imageType);
        return area.getSize();
    }

覆盖原始jxls-2.3.0.jar包中的org.jxls.ImageCommand class 

测试结果如下

测试方法如下

 public static void execute2() throws IOException {
        try(InputStream is = ImageDemo.class.getResourceAsStream(template2)) {
            try (OutputStream os = new FileOutputStream(output2)) {
                Context context = new Context();
                java.util.List<Department> list =new ArrayList<Department>();
                InputStream imageInputStream = ImageDemo.class.getResourceAsStream("business.jpg");
                byte[] imageBytes = Util.toByteArray(imageInputStream);
                
                for(int i=1;i<4;i++){
                	Department department = new Department("Test Department");
                	department.setName("name-"+i);
                    department.setImage(imageBytes);
                    department.setLink(i+"-link");
                    list.add(department);
                }
                Department d=new Department();
                d.setImage(imageBytes);
                context.putVar("list", list);
                JxlsHelper.getInstance().processTemplate(is, os, context);
            }
        }
    }

 

jxls可以很方便的生成复杂的excel文档

记录下来,希望帮到以后出现该问题的同学

 

共有 人打赏支持
粉丝 0
博文 1
码字总数 537
×
寒松
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: