文档章节

Jxls导出图片

 寒松
发布于 2016/12/09 15:25
字数 537
阅读 351
收藏 3

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
作品 0
深圳
私信 提问
jxls模板导出图片

用jxls模板比较开心的就是,不需要在excle数格子,只要创建excle模板后,就能够快速得到自己想要的excel了。不过也有限制,就是如果需要导出图片的话,还是需要自己手动编写代码来解决这个问...

miaojiangmin
2016/11/14
35
0
[已解决] 使用 jxls 导出excel,发现单元格中的 url 地址内容被截断了

请教使用过 jxls 的兄弟: 项目中使用 jxls 导出excel,导出的字段内容中有一个字段内容是 url 地址(http://.....),导出发现,url地址被截断了:只剩下 http: 了,后面的网站没有了,如下...

山哥
2013/10/29
928
2
mysql group-concat函数的长度限制

最近在做利用jxls导出excel的一个小功能,其中有一个导出是调用存储过程然后导出到excel中。就当以为跟普通的导出没有什么区别之后轻松加愉悦的完成了功能开发,不料在测试的过程中发现excel...

smileplus
2016/05/09
497
0
关于生成报表的问题?

想通过JXLS工具实现通用的导出excel报表,有什么好的思路?

一脸茫然
2016/10/20
80
0
jxls在导出Excel时可以给某一列加超链接吗

jxls在导出Excel时可以给某一列加超链接吗?如果可以的话怎样实现,大神看下

那时花开
2014/03/20
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
17
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
11
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部