5、进阶之Jxls2的加载图片

Jxls2
placeholder image
admin 发布于:2018-04-04 14:59:01
阅读:loading

基本介绍

本章节将在导出逻辑中演示加载并显示图片的场景,分为单个图片的引用和数据循环时的图片显示。本示例涉及jxls2jx: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为二进制的图片参数。

模板介绍

image.png


image.png

模板说明

上述2个模板中有2组示例,分别是显示一个图片和循环显示一组数据的图片。

运行示例

image.png


image.png

运行说明

示例中分为2种情况的导入图片,第二个示例中由于模板中设置了循环表格的边框,实际结果在显示时发现少了边框了,经过一点点时间的探索发现并不好使,我想如果要想解决这个图片单元格边框的问题还是得用Poi进行二次处理。

相关下载

out_simpleImage.xls

本示例代码会在后文中提供。

 点赞


 发表评论

当前回复:作者

 评论列表


留言区