zoukankan      html  css  js  c++  java
  • EasyExcelUtils


    import com.alibaba.excel.EasyExcelFactory;
    import com.alibaba.excel.ExcelWriter;
    import com.alibaba.excel.context.AnalysisContext;
    import com.alibaba.excel.event.AnalysisEventListener;
    import com.alibaba.excel.metadata.BaseRowModel;
    import com.alibaba.excel.metadata.Sheet;
    import com.alibaba.excel.support.ExcelTypeEnum;
    import com.alibaba.excel.util.CollectionUtils;
    import com.alibaba.excel.util.StringUtils;
    import com.sf.ryd.core.constant.Constant;
    import lombok.Data;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;

    public class EasyExcelUtils {


    private static final Logger logger = LoggerFactory.getLogger(EasyExcelUtils.class);

    private static Sheet initSheet;

    static {
    initSheet = new Sheet(1, 0);
    initSheet.setSheetName("sheet");
    // 设置自适应宽度
    initSheet.setAutoWidth(Boolean.TRUE);
    }

    /**
    * 读取少于1000行数据
    *
    * @param filePath 文件绝对路径
    * @return
    */
    public static List<Object> readLessThan1000Row(String filePath) {
    return readLessThan1000RowBySheet(filePath, null);
    }

    /**
    * 读取少于1000行数据,带样式的
    *
    * @param filePath 文件绝对路径
    * @param sheet
    * @return
    */
    public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet) {
    if (!StringUtils.hasText(filePath)) {
    return null;
    }

    sheet = sheet != null ? sheet : initSheet;

    InputStream inputStream = null;
    try {
    inputStream = new FileInputStream(filePath);
    return EasyExcelFactory.read(inputStream, sheet);
    } catch (FileNotFoundException e) {
    logger.error("找不到文件或者文件路径错误", e);
    } finally {
    try {
    if (inputStream != null) {
    inputStream.close();
    }
    } catch (IOException e) {
    logger.error("excel文件读取失败,失败原因:{}", e);
    }
    }
    return null;
    }

    /**
    * 读取大于1000行数据
    * @param filePath
    * @return
    */
    public static List<Object> readMoreThan1000Row(String filePath) {
    return readMoreThan1000RowBySheet(filePath, null);
    }

    /**
    * 读取大于1000行数据
    * @param filePath
    * @param sheet
    * @return
    */
    public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet) {
    if (!StringUtils.hasText(filePath)) {
    return null;
    }
    sheet = sheet != null ? sheet : initSheet;

    InputStream inputStream = null;
    try {
    inputStream = new FileInputStream(filePath);
    ExcelListener excelListener = new ExcelListener();
    EasyExcelFactory.readBySax(inputStream, sheet, excelListener);
    return excelListener.getDatas();
    } catch (FileNotFoundException e) {
    logger.error("找不到文件或者文件路径错误");
    } finally {
    try {
    if (inputStream != null) {
    inputStream.close();
    }
    } catch (IOException e) {
    logger.error("excel文件读取失败,失败原因:{}", e);
    }
    }
    return null;
    }

    /**
    * 导出单个sheet
    * @param response
    * @param dataList
    * @param sheet
    * @param fileName
    * @throws UnsupportedEncodingException
    */
    public static void writeExcelOneSheet(HttpServletResponse response, List<? extends BaseRowModel> dataList, Sheet sheet, String fileName) {

    // 如果sheet为空,则使用默认的
    if (null == sheet) {
    sheet = initSheet;
    }
    try {
    String value = "attachment; filename=" + new String(
    (fileName + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ExcelTypeEnum.XLSX.getValue()).getBytes("gb2312"), "ISO8859-1");
    response.setContentType("multipart/form-data");
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/vnd.ms-excel;charset=utf-8");
    response.setHeader("Content-disposition", value);

    ServletOutputStream out = response.getOutputStream();
    ExcelWriter writer = EasyExcelFactory.getWriter(out, ExcelTypeEnum.XLSX, true);
    // 设置属性类
    sheet.setClazz(dataList.get(0).getClass());
    writer.write(dataList, sheet);
    writer.finish();
    out.flush();
    } catch (IOException e) {
    logger.error("导出失败,失败原因:{}", e);
    }
    }

    /**
    * @Author lockie
    * @Description 导出excel 支持一张表导出多个sheet
    * @Param OutputStream 输出流
    * Map<String, List> sheetName和每个sheet的数据
    * ExcelTypeEnum 要导出的excel的类型 有ExcelTypeEnum.xls 和有ExcelTypeEnum.xlsx
    * @Date 上午12:16 2019/1/31
    */
    public static String writeExcelMutilSheet(Map<String, List<? extends BaseRowModel>> dataList, String fileName, String savePath) throws UnsupportedEncodingException {
    if (CollectionUtils.isEmpty(dataList)) {
    return Constant.STRING_0;
    }
    try {
    String name = new String((fileName + new SimpleDateFormat("yyyyMMddHHmm").format(new Date()) + ExcelTypeEnum.XLSX.getValue()).getBytes("gb2312"), "ISO8859-1");
    File file = new File(savePath + File.separator + name);
    FileOutputStream fos = new FileOutputStream(file);
    ExcelWriter writer = new ExcelWriter(fos, ExcelTypeEnum.XLSX, true);
    // 设置多个sheet
    setMutilSheet(dataList, writer);
    writer.finish();
    fos.flush();
    return name;
    } catch (IOException e) {
    logger.error("导出异常", e);
    return Constant.STRING_0;
    }
    }


    /**
    * @Author lockie
    * @Description //setSheet数据
    * @Date 上午12:39 2019/1/31
    */
    private static void setMutilSheet(Map<String, List<? extends BaseRowModel>> dataList, ExcelWriter writer) {
    int sheetNum = 1;
    for (Map.Entry<String, List<? extends BaseRowModel>> stringListEntry : dataList.entrySet()) {
    Sheet sheet = new Sheet(sheetNum, 0, stringListEntry.getValue().get(0).getClass());
    sheet.setSheetName(stringListEntry.getKey());
    writer.write(stringListEntry.getValue(), sheet);
    sheetNum++;
    }
    }



    /**
    * 导出监听
    */
    @Data
    public static class ExcelListener extends AnalysisEventListener {
    private List<Object> datas = new ArrayList<>();

    /**
    * 逐行解析
    * @param object 当前行的数据
    * @param analysisContext
    */
    @Override
    public void invoke(Object object, AnalysisContext analysisContext) {
    logger.info("监听数据:{}",object);
    Integer currentRowNum = analysisContext.getCurrentRowNum();
    logger.info("监听行:{},数据:{}",currentRowNum,object);
    // 当前行
    // analysisContext.getCurrentRowNum()
    if (object != null) {
    datas.add(object);
    }
    }


    /**
    * 解析完所有数据后会调用该方法
    * @param analysisContext
    */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    System.out.println("导出所有数据:"+datas);
    }
    }


    /**
    * test
    *
    * @param args
    * @param response
    * @throws UnsupportedEncodingException
    */
    public static void main(String[] args, HttpServletResponse response) throws UnsupportedEncodingException {
    // 导出多个sheet
    // List<OrderExportDTO> orderExportDTOList = new ArrayList<>();
    // Map<String, List<? extends BaseRowModel>> map = new HashMap<>();
    // map.put("自营订单", orderExportDTOList);
    // map.put("互联互通", orderExportDTOList);
    // String fileName = new String(("测试导出2019").getBytes(), "UTF-8");
    // writeExcelMutilSheet(response, map, fileName);

    // 导出单个sheet
    // writeExcelOneSheet(response, orderExportDTOList, null, fileName);
    }
    }
  • 相关阅读:
    347. Top K Frequent Elements
    437. Path Sum III
    338. Counting Bits
    337. House Robber III
    494. Target Sum
    416. Partition Equal Subset Sum
    LINUX 使用grep命令查看某个指定时间段的日志
    git 常用命令操作
    Python之IDE工具下载安装及注册详解及创建项目
    Python下载安装及验证
  • 原文地址:https://www.cnblogs.com/pxzbky/p/12034053.html
Copyright © 2011-2022 走看看