最近一直在研究jxls导出问题,目前用的版本是2.4.3,标签都是写在批注中,很方便;
最近做的项目需要用到导出多个sheet,导出方法很简单,但是始终会多出一个模板sheet,于是去官网找了例子查看,也都是带有一个Template的sheet,没有说明怎样去掉;
找了api,方法jxlsHelper.setDeleteTemplateSheet(true)没有起作用;方法transformer.deleteSheet("Template")会把这个模板sheet删掉,但是后面根据Template创建sheet时候失败,导致导出文件失效;
又去网上一遍又一遍的搜索,没有一个能给出答案,有人也发现了这个问题,比如..;
于是只能研究源码,找到了问题,下面把方法分享出来,供大家参考;
如下是测试时候的导出,可以看出是用processTemplate方法,如下:
public static void exportExcel(String templatePath,String destPath, Map<String,Object> params)
throws IOException {
Context context = new Context();
if (params != null) {
for (String key : params.keySet()){
context.putVar(key, params.get(key));
}
}
InputStream in = new FileInputStream(templatePath);
OutputStream out = new FileOutputStream(destPath);
JxlsHelper.getInstance().setDeleteTemplateSheet(true).processTemplate(in,out,context);
}
进去jar包,找到类JxlsHelper,可以看到方法jxlsHelper.setDeleteTemplateSheet(true)起作用是在调用processTemplateAtCell()跟方法processGridTemplateAtCell(),而且第一个sheet还不能删除,由此可见,jxlsHelper.setDeleteTemplateSheet(true)删不掉模板Sheet;如下:
所以只能改processTemplate方法;如下图:
原理:在生成sheet后且写出流之前,把模板sheet删除;
步骤:在官网下载对应的版本,把JxlsHelper.java改完后编译,然后放到jar包中,测试用新jar包导出,导出结果中没有了模板sheet,一切OK。