文档章节

Jxls导出图片

 寒松
发布于 2016/12/09 15:25
字数 537
阅读 322
收藏 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 导出excel,发现单元格中的 url 地址内容被截断了

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

山哥
2013/10/29
662
2
jxls模板导出图片

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

miaojiangmin
2016/11/14
35
0
mysql group-concat函数的长度限制

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

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

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

一脸茫然
2016/10/20
63
0
SSH导出Excel的进度条问题

我的项目是用SSH框架,用的jxls的Excel导出工具。我想在导出大量数据的时候加一个进度条,这个要怎么加?请高手指教。。。。

吕檀溪
2014/06/03
363
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 公司女同事约我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享水木年华的单曲《蝴蝶花(2002年大提琴版)》 《蝴蝶花(2002年大提琴版)》- 水木年华 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
5分钟前
12
4
Linux环境搭建 | VMware下共享文件夹的实现

在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了。本文介绍了两种共享文...

良许Linux
今天
5
0
JUC锁框架——AQS源码分析

JUC锁介绍 Java的并发框架JUC(java.util.concurrent)中锁是最重要的一个工具。因为锁,才能实现正确的并发访问。而AbstractQueuedSynchronizer(AQS)是一个用来构建锁和同步器的框架,使用A...

长头发-dawn
今天
3
0
docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
今天
4
1
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部