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为后台填充数据时向后扩展的行数。
模板参考为:
模板说明
模板中B列为用户Sex属性的循环合并项,其中最终实现是将这些格子转换为Poi的Cell对象,并由Sheet对象根据mergerRows的值去进行动态效果合并的。
运行示例为:
运行说明
示例显示了使用自定义函数实现单元格合并的效果。注意了这里的实现简单是因为在构造数据时已经将数据转换为与自定义函数解析一致的结构逻辑了,真正复杂的在转换数据结构上,并且如果需要实现多列合并时这里的代码肯定就不能行了,抛玉引砖。
相关下载
本示例代码会在后文中提供。