EasyExcel


原文:https://www.jianshu.com/p/d1d264c817ef

官网:https://www.yuque.com/easyexcel

API:https://alibaba-easyexcel.github.io/

GitHub:https://github.com/alibaba/easyexcel

package com.gdda.archives.platform.qc.checker.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;

public class ExcelUtil {
    /**
     * 写出一个 excel 文件到本地
     * 
* 将类型所有加了 @ExcelProperty 注解的属性全部写出 * *
@param fileName 文件名 不要后缀 * @param sheetName sheet名 * @param data 写出的数据 * @param clazz 要写出数据类的Class类型对象 * @param 写出的数据类型 */ public static void writeExcel(String fileName, String sheetName, List data, Class clazz) { writeExcel(null, fileName, sheetName, data, clazz); } /** * 按照指定的属性名进行写出 一个 excel * * @param attrName 指定的属性名 必须与数据类型的属性名一致 * @param fileName 文件名 不要后缀 * @param sheetName sheet名 * @param data 要写出的数据 * @param clazz 要写出数据类的Class类型对象 * @param 要写出的数据类型 */ public static void writeExcel(Set attrName, String fileName, String sheetName, List data, Class clazz) { try(FileOutputStream fos = new FileOutputStream(fileName)) { write(fos,attrName,sheetName,data,clazz); } catch (Exception exception) { exception.printStackTrace(); } } /** * 读取 指定格式的 excel文档 * * @param fileName 文件名 * @param clazz 数据类型的class对象 * @param 数据类型 * @return */ public static List readExcel(String fileName, Class clazz) { return readExcel(fileName, clazz, null); } /** * 取 指定格式的 excel文档 * 注意一旦传入自定义监听器,则返回的list为空,数据需要在自定义监听器里面获取 * * @param fileName 文件名 * @param clazz 数据类型的class对象 * @param readListener 自定义监听器 * @param 数据类型 * @return */ public static List readExcel(String fileName, Class clazz, ReadListener readListener) { try(FileInputStream fis = new FileInputStream(fileName)) { return read(fis,clazz,readListener); } catch (Exception exception) { exception.printStackTrace(); } return null; } /** * 导出 一个 excel * 导出excel所有数据 * @param response * @param fileName 件名 最好为英文,不要后缀名 * @param sheetName sheet名 * @param data 要写出的数据 * @param clazz 要写出数据类的Class类型对象 * @param 要写出的数据类型 */ public static void export(HttpServletResponse response, String fileName, String sheetName, List data, Class clazz) { export(response, null, fileName, sheetName, data, clazz); } /** * 按照指定的属性名进行写出 一个 excel * * @param response * @param attrName 指定的属性名 必须与数据类型的属性名一致 * @param fileName 文件名 最好为英文,不要后缀名 * @param sheetName sheet名 * @param data 要写出的数据 * @param clazz 要写出数据类的Class类型对象 * @param 要写出的数据类型 */ public static void export(HttpServletResponse response, Set attrName, String fileName, String sheetName, List data, Class clazz) { response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setCharacterEncoding("utf-8"); response.addHeader("Content-disposition", "attachment;filename=" + fileName + ExcelTypeEnum.XLSX.getValue()); try(OutputStream os = response.getOutputStream()) { write(os,attrName,sheetName,data,clazz); } catch (IOException e) { e.printStackTrace(); } } /** * 接收一个excel文件,并且进行解析 * 注意一旦传入自定义监听器,则返回的list为空,数据需要在自定义监听器里面获取 * @param multipartFile excel文件 * @param clazz 数据类型的class对象 * @param readListener 监听器 * @param * @return */ public static List importExcel(MultipartFile multipartFile,Class clazz,ReadListener readListener) { try(InputStream inputStream = multipartFile.getInputStream()) { return read(inputStream,clazz,readListener); } catch (IOException e) { e.printStackTrace(); } return null; } private static void write(OutputStream os, Set attrName, String sheetName, List data, Class clazz) { ExcelWriterBuilder write = EasyExcel.write(os, clazz); // 如果没有指定要写出那些属性数据,则写出全部 if (!CollectionUtils.isEmpty(attrName)) { write.includeColumnFiledNames(attrName); } write.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet(sheetName).doWrite(data); } private static List read(InputStream in,Class clazz, ReadListener readListener) { List list = new ArrayList<>(); Optional optional = Optional.ofNullable(readListener); EasyExcel.read(in, clazz, optional.orElse(new AnalysisEventListener() { @Override public void invoke(T data, AnalysisContext context) { list.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { System.out.println("解析完成"); } })).sheet().doRead(); return list; } }