这段时间因为公司业务需求,需要每天、每周为运营人员做个数据统计,需要按照给定的模板,定时将数据导出并发送给指定的人,如果纯粹用POI去做的话,生成指定模板格式的excel会很复杂,所以在玩网上搜了一下,看看有没有好的现成的工具,结果让我发现的一个非常好用又非常简单的工具,那就是jxls,刚开始用的jxls1.x,但是功能还不能满足我的所有要求,所以后来升级换成了现在使用的jxls2.x版本,现在将jxls2.x的使用通过博客记录下来,以后如果还需要用到,直接看自己写的博客就可以了。
jxls使用非常简单,只需要事先做好需要生成的excel样式,再加入jxls的指令和表达式即可做成模板文件,根据模板文件可以原样输出excel文件,特别是对于复杂样式的模板,简直不要太爽~~~
jxls
官网地址:http://jxls.sourceforge.net/index.html
最开始是按照李狐同学的博客:https://blog.csdn.net/sinat_15769727/article/details/78898894 完成的第一版,但是没有合并单元格的功能,之后找到 lnktoking 写的开源jxls 增强版 jxlss:https://gitee.com/lnkToKing/jxlss,将其中新功能之一的合并单元格功能整合到自己的项目中,非常感谢两位大神的贡献。
话不多说,接下来直接上代码
首先导入jxls的依赖:
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.4.6</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-jexcel</artifactId>
<version>1.0.6</version>
</dependency>
使用的jxls的版本是2.4.6,jxls-poi的版本是1.0.12,有了这两个依赖就可以完成excel的导出了,但是如果需要动态合并单元格的话就需要导入jxls-jexcel的依赖
站在巨人的肩膀上,导出使用的封装工具类:
package com.xixi.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;
public class JxlsUtils{
static{
//添加自定义指令(可覆盖jxls原指令)
//合并单元格(模板已经做过合并单元格操作的单元格无法再次合并)
XlsCommentAreaBuilder.addCommandMapping("merge", MergeCommand.class);
}
public static void exportExcel(InputStream is, OutputStream os, Map<String, Object>
model) throws IOException{
Context context = PoiTransformer.createInitialContext();
if (model != null) {
for (Map.Entry<String, Object> entry : model.entrySet()){
context.putVar(entry.getKey(), entry.getValue());
}
}
JxlsHelper jxlsHelper = JxlsHelper.getInstance();
Transformer transformer = jxlsHelper.createTransformer(is, os);
//获得配置
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
//设置静默模式,不报警告
evaluator.getJexlEngine().setSilent(true);
//函数强制,自定义功能
Map<String, Object> funcs = new HashMap<String, Object>();
funcs.put("jx", new JxlsUtils()); //添加自定义功能