使用Jxls导出:以浏览器方式下载

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;
}

创建模板文件内容如下:

使用Jxls导出:以浏览器方式下载_第1张图片

保存路径如图:

注意事项:1.模板文件必须保证有     2.模板文件的批注也一定要有

因为最终写入数据的时候,是通过批注去扫描区域写入的,然后找寻相同的字段写入表格中

 

 lastCell="D4"   代表的扫描到哪个区域,一般为属性值的最后一格,如图:

使用Jxls导出:以浏览器方式下载_第2张图片

导出结果如图:

 使用Jxls导出:以浏览器方式下载_第3张图片

具体的一些JEXL语法,可以自行网上了解一下:

以上就是使用Jxls的一些操作!!!!!

你可能感兴趣的:(使用Jxls导出:以浏览器方式下载)