文档章节

Jxls导出图片

 寒松
发布于 2016/12/09 15:25
字数 537
阅读 294
收藏 3
点赞 0
评论 0

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 ⋅ 2

jxls模板导出图片

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

miaojiangmin ⋅ 2016/11/14 ⋅ 0

mysql group-concat函数的长度限制

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

smileplus ⋅ 2016/05/09 ⋅ 0

SSH导出Excel的进度条问题

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

吕檀溪 ⋅ 2014/06/03 ⋅ 1

java/jsp JXLS 导出多sheet的excel

想用模板导出一个excel,这个excel有多个sheet 每个sheet绑定一个表的查询数据。动态导出 这样使用JXLS能实现吗?请高手指点迷津!谢谢。

sisyphus ⋅ 2014/01/06 ⋅ 1

关于生成报表的问题?

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

一脸茫然 ⋅ 2016/10/20 ⋅ 0

数据量不确定的情况下导出excel饼图图表的方法?

大家好,我一直用jxls+poi导出excel表格,框架建好,主要把excel模板做好就能导出数据了,比较方便,但是今天遇到新的情况:需要导出的excel里包含一个饼图统计表。 但是统计的数据在做模板时...

ActionTime ⋅ 2016/10/28 ⋅ 0

使用jxls操作excel模板时总是迭代出错,求救!!

使用jxls操作excel模板时总是迭代出错: 模板文件如下: 导出文件如下:

wwx91322 ⋅ 2013/05/15 ⋅ 1

jxls在导出Excel时可以给某一列加超链接吗

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

那时花开 ⋅ 2014/03/20 ⋅ 0

Jxls日期格式化问题

使用Jxls模版导出Excel,怎样格式化日期? 如:2014-01-01 代码: ${obj.date} 结果:

amss ⋅ 2014/06/03 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

x64: TITLE Add and Subtract (AddSub.asm) ; This program adds and subtracts 32-bit integers. ; Last update: 2/1/02 ;.MODEL flat,stdcall x64 not su......

simpower ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 昨天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 昨天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部