12、进阶之Jxls2的单元格合并

http://www.chendd.cn/information/viewInformation/other/235.a

本章节将在导出逻辑中演示使用Jxls2时在模板实现单元格合并的效果。实际上官网上提供的单元格合并并非为我们所需要的实际效果,而是使用循环嵌套的方式来进行数据展示而已,单元格并未实现合并。之前在Jxls1的时候也都是使用它生产报表Excel文件,再使用Poi二次去实现单元格合并的逻辑。经过最后的自定义函数分析后,我觉得在简单的报表实现中,我们可以使用它的自定义函数功能实现单元格的合并效果,为了写的简单在构造数据的时候我直接将数据生成与单元格合并实现一致的结构。

Java代码参考为:

package cn.chendd.examples;



import java.io.File;

import java.io.FileOutputStream;

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.area.Area;

import org.jxls.builder.AreaBuilder;

import org.jxls.builder.xls.XlsCommentAreaBuilder;

import org.jxls.common.CellRef;

import org.jxls.common.Context;

import org.jxls.expression.JexlExpressionEvaluator;

import org.jxls.transform.Transformer;

import org.jxls.transform.poi.WritableCellValue;

import org.jxls.util.TransformerFactory;



import cn.chendd.examples.custom.functions.MergeCellValue;

import cn.chendd.examples.vo.User;



/**

 * 简单横向单元格合并

 */

public class SimpleMergeJxls {



   public static void main(String[] args) throws Exception {

     

      //模板文件

      InputStream is = SimpleCustomFunctionJxls.class.getClass().getResourceAsStream("/cn/chendd/examples/templates/simpleMergeCell.xls");

      Context context = new Context();

      //设置绑定集合

      List<User> dataList = new ArrayList<User>();

      dataList.add(new User("yuji" , "保密" , 120D , 0));

      dataList.add(new User("zhangchunhua" , "女" , 120D , 0));

      dataList.add(new User("caifuren" , "女" , 120D , 1));

      dataList.add(new User("zhouyu" , "男" , 100D , 0));

      dataList.add(new User("sunce" , "男" , 110D , 0));

      dataList.add(new User("machao" , "男" , 130D , 2));

      dataList.add(new User("zuoci" , "保密" , 150D , 0));

      context.putVar("dataList", dataList);

     

      Map<String , Object> myFunction = new HashMap<String , Object>();

      myFunction.put("mg", new SimpleMergeJxls());

     

      OutputStream os = new FileOutputStream(new File("d:\\test\\out_simpleMergeCell.xls"));

      Transformer trans = TransformerFactory.createTransformer(is, os);

      JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) trans.getTransformationConfig().getExpressionEvaluator();

      evaluator.getJexlEngine().setFunctions(myFunction);

      //载入模板、处理导出

      AreaBuilder areaBuilder = new XlsCommentAreaBuilder(trans);

      List<Area> areaList = areaBuilder.build();

      areaList.get(0).applyAt(new CellRef("简单单元格合并!A1"), context);

      trans.write();

//    JxlsHelper.getInstance().processTemplate(is, os, context);

      //释放资源

      os.flush();

      os.close();

      is.close();

     

   }

  

   //单元格合并

   public WritableCellValue mergeCell(String value , Integer mergerRows) {

      return new MergeCellValue(value , mergerRows);

   }



}

 

代码说明

代码中向模板中输出了用户信息的集合数据,其中用户的性别数据中有重复项,mg为自定义函数的前缀,mergerCell为单元格合并的函数,value为当前格子的值,mergerRows为后台填充数据时向后扩展的行数。

模板参考为:

blob.png

模板说明

模板中B列为用户Sex属性的循环合并项,其中最终实现是将这些格子转换为Poi的Cell对象,并由Sheet对象根据mergerRows的值去进行动态效果合并的。

运行示例为:

blob.png

运行说明

示例显示了使用自定义函数实现单元格合并的效果。注意了这里的实现简单是因为在构造数据时已经将数据转换为与自定义函数解析一致的结构逻辑了,真正复杂的在转换数据结构上,并且如果需要实现多列合并时这里的代码肯定就不能行了,抛玉引砖。

相关下载

 

icon_txt.gifout_simpleMergeCell.xls

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

 

转载于:https://my.oschina.net/haiyangyiba/blog/2246046

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jxls2 是一个用于生成 Excel 文档的 Java 库,它支持在 Excel 中加载图片。要在 Excel 中加载图片,需要做以下几个步骤: 1. 在 Excel 模板文件中插入图片占位符:在模板文件中选中一个单元格,然后插入一张图片。将图片大小调整为合适的大小,并将其移动到需要插入图片的位置。 2. 在 Java 代码中加载图片:使用 Java 中的 File 类或者 IO 流将图片加载到内存中。 3. 将图片数据传递给 Jxls2:使用 Jxls2 提供的 ImageDataBuilder 类将图片数据传递给 Jxls2。 4. 将图片数据与 Excel 模板文件进行合并:在 Java 代码中使用 Jxls2 提供的 API 将图片数据与 Excel 模板文件进行合并生成最终的 Excel 文件。 下面是一个简单的示例代码: ``` // 加载图片 InputStream inputStream = new FileInputStream("image.jpg"); byte[] bytes = IOUtils.toByteArray(inputStream); // 构建 ImageData 对象 ImageData imageData = new ImageDataBuilder(bytes).build(); // 将 ImageData 与 Excel 模板文件进行合并 try (OutputStream outputStream = new FileOutputStream("output.xlsx")) { Transformer transformer = TransformerFactory.createTransformer(getClass().getResourceAsStream("template.xlsx"), outputStream); List<Map<String, Object>> data = new ArrayList<>(); Map<String, Object> map = new HashMap<>(); map.put("image", imageData); data.add(map); transformer.transform(new HashMap<String, Object>(), data); } ``` 其中,"image.jpg" 是需要加载的图片文件路径,"template.xlsx" 是 Excel 模板文件路径,"output.xlsx" 是最终生成的 Excel 文件路径。在 Excel 模板文件中,需要插入一张图片,并在对应的单元格中设置图片占位符为 ${image}。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值