jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。java中成熟的excel导出工具有pol、jxl,但他们都是使用java代码的方式来导出excel,编码效率很低且不方便维护。
还可以使用一些工具很轻松的实现模板导出。这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是这个JXLS了。
比较:
一般一些企业级项目中有很多复杂的报表(大量单元格合并和单元格样式),easyPOI处理合并单元格时候容易出现残损的情况,poi代码维护成本高。所以使用jxls是一个比较好的方法,同时也支持模板来导出。
首先导入maven依赖:
org.jxls
jxls
2.4.6
org.jxls
jxls-poi
1.0.15
创建实体类:
package com.example.projectdemo.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class Employee {
private String name;
private Date birthDate;
private BigDecimal payment;
private BigDecimal bonus;
public Employee(String name, Date birthDate, BigDecimal payment, BigDecimal bonus) {
this.name = name;
this.birthDate = birthDate;
this.payment = payment;
this.bonus = bonus;
}
public Employee(String name, Date birthDate, double payment, double bonus) {
this(name, birthDate, new BigDecimal(payment), new BigDecimal(bonus));
}
}
下面看看代码:下面是工具类:
package com.example.projectdemo.utils;
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;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JxlsUtils {
public static void exportExcel(InputStream is, OutputStream os, Map model) throws IOException{
Context context = PoiTransformer.createInitialContext();
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();
//设置静默模式,不报警告
//evaluator.getJexlEngine().setSilent(true);
//函数强制,自定义功能
Map funcs = new HashMap();
funcs.put("utils", new JxlsUtils()); //添加自定义功能
evaluator.getJexlEngine().setFunctions(funcs);
//必须要这个,否者表格函数统计会错乱
jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
}
public static void exportExcel(File xls, File out, Map model) throws FileNotFoundException, IOException {
exportExcel(new FileInputStream(xls), new FileOutputStream(out), model);
}
public static void exportExcel(String templatePath, OutputStream os, Map model) throws Exception {
File template = getTemplate(templatePath);
if(template != null){
exportExcel(new FileInputStream(template), os, model);
} else {
throw new Exception("Excel 模板未找到。");
}
}
//获取jxls模版文件
public static File getTemplate(String path){
File template = new File(path);
if(template.exists()){
return template;
}
return null;
}
// 日期格式化
public String dateFmt(Date date, String fmt) {
if (date == null) {
return "";
}
try {
SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);
return dateFmt.format(date);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
// if判断
public Object ifelse(boolean b, Object o1, Object o2) {
return b ? o1 : o2;
}
}
然后看看用法及导出:
@ApiOperation("使用Jxls导出表格")
@GetMapping("/jxls")
public void jxlsExportExcel(HttpServletResponse response) throws Exception {
// 模板路径和输出流
String templatePath = this.getClass().getClassLoader()
.getResource("jxls-template/object_collection_template.xls").getPath();
// 定义一个Map,往里面放入要在模板中显示数据
List employees = generateSampleEmployeeData();
OutputStream os = response.getOutputStream();
String fileName = "jxls.xls";
//如果想下载试自动填好文件名,需要设置Content-Disposition响应头
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.setContentType("application/vnd.ms-excel");
Map model = new HashMap();
model.put("employees", employees);
model.put("nowdate", new Date());
//调用之前写的工具类,传入模板路径,输出流,和装有数据Map
JxlsUtils.exportExcel(templatePath, os, model);
os.close();
}
public static List generateSampleEmployeeData() throws ParseException {
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));
return employees;
}
创建模板文件内容如下:
保存路径如图:
注意事项:1.模板文件必须保证有 2.模板文件的批注也一定要有
因为最终写入数据的时候,是通过批注去扫描区域写入的,然后找寻相同的字段写入表格中
lastCell="D4" 代表的扫描到哪个区域,一般为属性值的最后一格,如图:
导出结果如图:
具体的一些JEXL语法,可以自行网上了解一下:
以上就是使用Jxls的一些操作!!!!!