5、进阶之Jxls2的加载图片
Jxls2admin 发布于:2018-04-04 14:59:01
阅读:loading
本章节将在导出逻辑中演示加载并显示图片的场景,分为单个图片的引用和数据循环时的图片显示。本示例涉及jxls2的jx:image表达式函数,需要自行另外掌握,另外该表达式函数中的图片类型imageType参数支持的范围可参见org.jxls.common.ImageType枚举类。单个图片的引用随便找了一个eclipse的旧版本图片,但是你得相信以我的示例是完全可以让你得图片出现在这里的;循环的图片也同样是随便找的eclipse中的工具图片。
package cn.chendd.examples;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
/**
* 简单引用图片的示例
* 感觉设置的格式没啥用
* @author chendd
*/
public class SimpleImageJxls {
public static void main(String[] args) throws Exception {
//构造图片数据
byte imageBytes[] = getImageBytes("/cn/chendd/examples/images/splash.jpg");
//载入模板
InputStream is = SimpleImageJxls.class.getClass().getResourceAsStream("/cn/chendd/examples/templates/simpleImage.xls");
Context context = new Context();
context.putVar("image", imageBytes);//单一图片
byte prop3Bytes[] = getImageBytes("/cn/chendd/examples/images/wn_nav.png");
byte prop4Bytes[] = getImageBytes("/cn/chendd/examples/images/wr_nav.png");
//构造列表数据,包括两个图片
List<Map<String , Object>> dataList = new ArrayList<Map<String , Object>>();
Map<String , Object> m1 = new HashMap<String , Object>();
m1.put("prop1" , "p1-1");m1.put("prop2" , "p1-2");
m1.put("prop3" , prop3Bytes);m1.put("prop4" , prop4Bytes);
dataList.add(m1);
Map<String , Object> m2 = new HashMap<String , Object>();
m2.put("prop1" , "p2-1");m2.put("prop2" , "p2-2");
m2.put("prop3" , prop3Bytes);m2.put("prop4" , prop4Bytes);
dataList.add(m2);
Map<String , Object> m3 = new HashMap<String , Object>();
m3.put("prop1" , "p3-1");m3.put("prop2" , "p3-2");
m3.put("prop3" , prop3Bytes);m3.put("prop4" , prop4Bytes);
dataList.add(m3);
context.putVar("dataList", dataList);
OutputStream os = new FileOutputStream(new File("d:\\test\\out_simpleImage.xls"));
//指定Sheet文件解析
JxlsHelper.getInstance().processTemplate(is, os, context);
os.flush();
os.close();
is.close();
}
//获取图片的字节码,临时使用
private static byte[] getImageBytes(String imagePath) throws IOException {
byte imageBytes[] = null;
InputStream is = SimpleImageJxls.class.getClass().getResourceAsStream(imagePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte bytes[] = new byte[1024];
int lens = -1;
try {
while ((lens = is.read(bytes)) != -1) {
baos.write(bytes, 0, lens);
}
imageBytes = baos.toByteArray();
} catch (IOException e) {
throw new IOException(e);
} finally {
baos.flush();
baos.close();
is.close();
}
return imageBytes;
}
}
代码说明
上述代码中我们可以看出由后台设置了 “dataList”的集合列表数据结构,其中每一条数据都是以键值对对应的字段信息,prop1、prop2二为文本字段,prop3和prop4为二进制的图片参数。
模板介绍
模板说明
上述2个模板中有2组示例,分别是显示一个图片和循环显示一组数据的图片。
运行示例
运行说明
示例中分为2种情况的导入图片,第二个示例中由于模板中设置了循环表格的边框,实际结果在显示时发现少了边框了,经过一点点时间的探索发现并不好使,我想如果要想解决这个图片单元格边框的问题还是得用Poi进行二次处理。
相关下载
本示例代码会在后文中提供。
点赞