JXLS (Excel导入、导出工具使用)
1:简介:
jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。java中成熟的excel导出工具有pol、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。
还可以使用一些工具很轻松的实现模板导出。这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是这个JXLS了。
比较:
项目中有很多复杂的报表(大量单元格合并和单元格样式),easyPOI处理合并单元格时候容易出现残损的情况,poi代码维护成本高。
2:maven依赖:
org.jxls
jxls
2.4.6
org.jxls
jxls-poi
1.0.12
org.jxls
jxls-jexcel
1.0.6
2:下面先做一个简单导出的实现:
1: 创建model:
2:先用office创建一个xlsx的模板
可以看到这里有一些cell 的文本批注,office中添加批注快捷键(Shit +F2),批注中的类容这里先不做解释,下面会讲到
3:工具类JxlsUtils.java
public classJxlsUtils{private static final String TEMPLATE_PATH="jxls-template";public static void exportExcel(InputStream is, OutputStream os, Map model) throwsIOException{
Context context= newContext();if (model != null) {for(String key : model.keySet()) {
context.putVar(key, model.get(key));
}
}
JxlsHelper jxlsHelper=JxlsHelper.getInstance();
Transformer transformer=jxlsHelper.createTransformer(is, os);
JexlExpressionEvaluator evaluator=(JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
Map funcs = new HashMap();
// funcs.put("utils", new JxlsUtils()); //添加自定义功能
// evaluator.getJexlEngine().setFunctions(funcs);
jxlsHelper.processTemplate(context, transformer);
}public static void exportExcel(File xls, File out, Map model) throwsFileNotFoundException, IOException {
exportExcel(new FileInputStream(xls), newFileOutputStream(out), model);
}public static void exportExcel(String templateName, OutputStream os, Map model) throwsFileNotFoundException, IOException {
File template=getTemplate(templateName);if(template!=null){
exportExcel(newFileInputStream(template), os, model);
}
}//获取jxls模版文件
public staticFile getTemplate(String name){
String templatePath= JxlsUtils.class.getClassLoader().getResource(TEMPLATE_PATH).getPath();
File template= newFile(templatePath, name);if(template.exists()){returntemplate;
}return null;
}//日期格式化
publicString dateFmt(Date date, String fmt) {if (date == null) {return "";
}try{
SimpleDateFormat dateFmt= newSimpleDateFormat(fmt);returndateFmt.format(date);
}catch(Exception e) {
e.printStackTrace();
}return "";
}//if判断
public Object ifelse(booleanb, Object o1, Object o2) {return b ?o1 : o2;
}
}
上面注释中的自定义功能可以先注释到,我们后面在讲
入口ObjectCollectionDemo.java
public classObjectCollectionDemo {static Logger logger = LoggerFactory.getLogger(ObjectCollectionDemo.class);public static void main(String[] args) throwsParseException, IOException {
logger.info("Running Object Collection demo");
List employees =generateSampleEmployeeData();
OutputStream os= new FileOutputStream("target/object_collection_output.xls");
Map model=new HashMap();
model.put("employees", employees);
model.put("nowdate", newDate());
JxlsUtils.exportExcel("object_collection_template.xls", os, model);
os.close();
}public static List generateSampleEmployeeData() throwsParseException {
List employees = new ArrayList();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MMM-dd", Locale.US);
employees.add(new Employee("Elsa", dateFormat.parse("1970-Jul-10"), 1500, 0.15) );
employees.add(new Employee("Oleg", dateFormat.parse("1973-Apr-30"), 2300, 0.25) );
employees.add(new Employee("Neil", dateFormat.parse("1975-Oct-05"), 2500, 0.00) );
employees.add(new Employee("Maria", dateFormat.parse("1978-Jan-07"), 1700, 0.15) );
employees.add(new Employee("John", dateFormat.parse("1969-May-30"), 2800, 0.20) );returnemployees;
}
}
生成效果:
好的,这样就很轻松的导出了是不是很简单
3:下面讲一下导出的细节,注意事项:
1:模板中的批注:
注意如果模板中对单元格加了批注,但是没有批注信息的话可能会报错:
1-1:bean属性标记
jxls使用 Apache JEXL表达式语言来解析定义在excel模板中的表达式。JEXL与JSTL相似,并对JSTL进行了扩展。eg:
${department.chief.age} //属性可以是无限深度
${utils:dateFmt(date,"yyyy-MM-dd")} //自定义工具函数
1-2:XLS Area定义标记