文档章节

Jxls导出图片

 寒松
发布于 2016/12/09 15:25
字数 537
阅读 338
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

SharedPreferences 的使用,commit和apply两个方法的区别

SharedPreferences sp = getSharedPreferences("config",MODE_PRIVATE); //第一个参数:存储文件的名称,第二个参数文件的访问权限,通常MODE_PRIVATE是私有存储 sp.edit().putString("USERNAM...

lanyu96
22分钟前
1
0
02-《Apache Tomcat 9 User Guide》之简介

1.Introduction - 介绍 For administrators and web developers alike, there are some important bits of information you should familiarize yourself with before starting out. This d......

飞鱼说编程
26分钟前
1
0
关于maven的使用,这一篇基本就够了

2.1 关于maven 每一个工具的出现都有其历史意义,而Maven的出现则是开发者对于不同的项目都要有自己的Ant构建文件,而这些文件都各不相同,而且JAR被检入CVS(Concurrent Version System),...

小小明童鞋
28分钟前
16
0
从xtrabackup完整备份恢复单个innodb表

现在大多数同学在线上采取的备份策略都是xtrabackup全备+binlog备份,那么当某天某张表意外的删除那么如何从xtrabackup全备中恢复呢?从mysql 5.6版本开始,支持可移动表空间(Transportable...

IT--小哥
32分钟前
1
0
百度AI攻城狮,用TensorFlow API训练目标检测模型(浣熊超可爱)

今天,人工智能正影响我们生产、生活的方方面面。10月10日,为期三天的2018华为全联接大会在上海拉开帷幕,此次大会以“+智能,见未来”为主题,发布了AI战略及全球领先的全栈全场景AI解决方...

Python唱情歌
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部