阿里EasyExcel导入导出


前言

使用阿里提供的EasyExcel进行excel的导入导出简单,方便,快捷


`

一、使用版本

    <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency>

二、工具类

1.导出

package org.jeecg.modules.utils;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 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.*;public class ExcelExportUtils {private static final Logger logger = LoggerFactory.getLogger(ExcelExportUtils.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* @param sheet* @return*/public static List<Object> readMoreThan1000Row(String filePath, Sheet sheet) {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* @param fileName* @throws UnsupportedEncodingException*/
//    public static void writeExcelOneSheet(HttpServletResponse response, List<? extends BaseRowModel> dataList, String fileName,String template) throws UnsupportedEncodingException {//
//        try {//            String target = "attachment; filename=" + new String(
//                    (fileName + new SimpleDateFormat("yyyyMMdd").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", target);
//
//            ServletOutputStream out = response.getOutputStream();
//            //工作薄对象
//            ExcelWriter excelWriter = EasyExcel.write(out,SubjectReport.class).withTemplate(template).build();
//            //工作区对象
//            WriteSheet writeSheet = EasyExcel.writerSheet().build();
//            excelWriter.fill(dataList,writeSheet);
//            excelWriter.finish();
//        } catch (UnsupportedEncodingException e) {//            e.printStackTrace();
//        } catch (IOException e) {//            e.printStackTrace();
//        }
//
//    }/*** 导出单个sheet(自动成模板,自定义路径)*/public static void writeExcelOneSheet1(HttpServletResponse response, List<? extends BaseRowModel> dataList, Sheet sheet, String fileName,String path) throws UnsupportedEncodingException {if (CollectionUtils.isEmpty(dataList)) {return;}// 如果sheet为空,则使用默认的if (null == sheet) {sheet = initSheet;}try {String value = "attachment; filename=" + new String((fileName + new SimpleDateFormat("yyyyMMdd").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);FileOutputStream out = new FileOutputStream(path);//ServletOutputStream out = response.getOutputStream(path);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);}}/*** 导出单个sheet(自动成模板,自定义路径)*/public static void writeExcelOneSheet2(HttpServletResponse response, List<? extends BaseRowModel> dataList, Sheet sheet, String fileName) throws UnsupportedEncodingException {if (CollectionUtils.isEmpty(dataList)) {return;}// 如果sheet为空,则使用默认的if (null == sheet) {sheet = initSheet;}try {String value = "attachment; filename=" + new String((fileName + new SimpleDateFormat("yyyyMMdd").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);//FileOutputStream out = new FileOutputStream(path);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 void writeExcelMutilSheet(HttpServletResponse response, Map<String, List<? extends BaseRowModel>> dataList, String fileName,String template) throws UnsupportedEncodingException {//        if (CollectionUtils.isEmpty(dataList)) {//            return;
//        }
//        try {//            String value = "attachment; filename=" + new String(
//                    (fileName + new SimpleDateFormat("yyyyMMdd").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 = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
//            ExcelWriter writer = EasyExcel.write(out, BiFinanceFeeDetail.class).withTemplate(template).build();
//            // 设置多个sheet
//            setMutilSheet(dataList, writer);
//            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 void writeExcelMutilSheetNew(HttpServletResponse response, Map<String, List<? extends BaseRowModel>> dataList, String fileName) throws UnsupportedEncodingException {if (CollectionUtils.isEmpty(dataList)) {return;}try {String value = "attachment; filename=" + new String((fileName + new SimpleDateFormat("yyyyMMdd").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 = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);//ExcelWriter writer = EasyExcel.write(out, BiFinanceFeeDetail.class).withTemplate(template).build();// 设置多个sheetsetMutilSheet(dataList, writer);writer.finish();out.flush();} catch (IOException e) {logger.error("导出异常", e);}}/*** @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()) {Map columnWidth = new HashMap();columnWidth.put(0, 8000);Sheet sheet = new Sheet(sheetNum, 0, stringListEntry.getValue().get(0).getClass());sheet.setColumnWidthMap(columnWidth);sheet.setSheetName(stringListEntry.getKey());writer.write(stringListEntry.getValue(), sheet);sheetNum++;}}/*** 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);}}

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.导入

package org.jeecg.modules.utils;import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;public class ExcelImportUtil {/*** 读取 Excel(多个 sheet)** @param excel    文件* @param rowModel 实体类映射,继承 BaseRowModel 类* @return Excel 数据 list*/public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel) throws Exception {ExcelListener excelListener = new ExcelListener();ExcelReader reader = getReader(excel, excelListener);if (reader == null) {return null;}for (Sheet sheet : reader.getSheets()) {if (rowModel != null) {sheet.setClazz(rowModel.getClass());}reader.read(sheet);}return excelListener.getDatas();}/*** 读取某个 sheet 的 Excel** @param excel    文件* @param rowModel 实体类映射,继承 BaseRowModel 类* @param sheetNo  sheet 的序号 从1开始* @return Excel 数据 list*/public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo) throws Exception {return readExcel(excel, rowModel, sheetNo, 1);}/*** 读取某个 sheet 的 Excel** @param excel       文件* @param rowModel    实体类映射,继承 BaseRowModel 类* @param sheetNo     sheet 的序号 从1开始* @param headLineNum 表头行数,默认为1* @return Excel 数据 list*/public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo,int headLineNum) throws Exception {ExcelListener excelListener = new ExcelListener();ExcelReader reader = getReader(excel, excelListener);if (reader == null) {return null;}reader.read(new Sheet(sheetNo, headLineNum, rowModel.getClass()));return excelListener.getDatas();}/*** 导出 Excel :一个 sheet,带表头** @param response  HttpServletResponse* @param list      数据 list,每个元素为一个 BaseRowModel* @param fileName  导出的文件名* @param sheetName 导入文件的 sheet 名* @param object    映射实体类,Excel 模型*/public static void writeExcel(HttpServletResponse response, List<? extends BaseRowModel> list,String fileName, String sheetName, BaseRowModel object) {ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLSX);Sheet sheet = new Sheet(1, 0, object.getClass());sheet.setSheetName(sheetName);writer.write(list, sheet);writer.finish();}/*** 导出文件时为Writer生成OutputStream*/private static OutputStream getOutputStream(String fileName, HttpServletResponse response) {//创建本地文件String filePath = fileName + ".xlsx";File dbfFile = new File(filePath);try {if (!dbfFile.exists() || dbfFile.isDirectory()) {dbfFile.createNewFile();}fileName = new String(filePath.getBytes(), "ISO-8859-1");response.addHeader("Content-Disposition", "filename=" + fileName);return response.getOutputStream();} catch (IOException e) {e.printStackTrace();return null;}}/*** 返回 ExcelReader** @param excel         需要解析的 Excel 文件* @param excelListener new ExcelListener()*/private static ExcelReader getReader(MultipartFile excel,ExcelListener excelListener) throws Exception {String filename = excel.getOriginalFilename();if (filename == null || (!filename.toLowerCase().endsWith(".xls") && !filename.toLowerCase().endsWith(".xlsx"))) {throw new Exception("文件格式错误!");}InputStream inputStream;try {inputStream = new BufferedInputStream(excel.getInputStream());return new ExcelReader(inputStream, null, excelListener, true);} catch (IOException e) {e.printStackTrace();}return null;}}

3.监听

package org.jeecg.modules.utils;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.util.ArrayList;
import java.util.List;public class ExcelListener extends AnalysisEventListener {//自定义用于暂时存储data。//可以通过实例获取该值private List<Object> datas = new ArrayList<>();/*** 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据*/@Overridepublic void invoke(Object object, AnalysisContext context) {//数据存储到list,供批量处理,或后续自己业务逻辑处理。datas.add(object);//根据业务自行 do somethingdoSomething();/*如数据过大,可以进行定量分批处理if(datas.size()<=100){datas.add(object);}else {doSomething();datas = new ArrayList<Object>();}*/}/*** 根据业务自行实现该方法*/private void doSomething() {}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {/*datas.clear();解析结束销毁不用的资源*/}public List<Object> getDatas() {return datas;}public void setDatas(List<Object> datas) {this.datas = datas;}
}

三、使用

需要相应的实体类,继承BaseRowModel, 字段上加@ExcelProperty(value = “BG”,index = 0)

value和数据库字段一直,index代表在excel中的顺序
导入:

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();MultipartFile file = fileMap.get("file");//获取上传文件对象List<Object> list = new ArrayList<>();try {list = ExcelImportUtil.readExcel(file,new EnergyAlertModel());} catch (Exception e) {e.printStackTrace();return Result.error("文件解析失败,请检查文件重新上传!");}

导出:

       try {//return super.exportXls(request, pmoBasicInformation, PmoBasicInformation.class, "项目基础信息表");// 设置列宽Map columnWidth = new HashMap();columnWidth.put(0, 8000);String fileName = "人力资源清单";List<PmoManpowerExcel> PmoManpowerExcelList = pmoManpowerService.exportXls();Sheet sheet1 = new Sheet(1, 0, PmoBasicInformationExcel.class);sheet1.setColumnWidthMap(columnWidth);sheet1.setSheetName(fileName);EasyExcelUtils.writeExcelOneSheet1(response,PmoManpowerExcelList,sheet1,fileName);} catch (Exception e) {throw new RuntimeException(e);}

阿里EasyExcel导入导出相关推荐

  1. EasyExcel导入导出下载模板(带下拉)

    EasyExcel导入导出网上资料很多,这里就不多做描述了,总之就是一款比较轻而小,易用的excel操作工具包:这里在项目中使用到,做下笔记.以及表格中下拉框的实现: 声明:本文思路是借鉴于某大神的, ...

  2. 【使用EasyExcel导入导出】

    使用EasyExcel导入导出 一,为什么要使用EasyExcel 1.1 EasyExcel与Poi的区别 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个 ...

  3. 使用阿里开源的EasyExcel导入导出EXCEL——工具类

    工具类 package com.example.demo.util.excel;import com.alibaba.excel.EasyExcel; import com.alibaba.excel ...

  4. Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.EasyExcel EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据 ...

  5. Spring Boot + EasyExcel 导入导出,好用到爆!

    今日推荐 Java 8 一行代码解决了空指针问题,太厉害了...List中remove()方法的陷阱,被坑惨了!25000 字详解 23 种设计模式,原来可以这么简单!最牛逼的 Java 日志框架,性 ...

  6. easyExcel导入导出(列锁定单元格、表头合并、导出类型限制、锁定单元格增加底色、设置密码、隐藏列等)

    easyexcel官网文档:https://www.yuque.com/easyexcel/doc/easyexcel easyexcel {maven 版本} GitHub网址:https://gi ...

  7. Easyexcel导入导出多个sheet

    EasyExcel对于导入导出的操作十分简洁,记录一下多个sheet且内容不一致的导入导出. 引入 easyExcel依赖 <dependency><groupId>com.a ...

  8. EasyExcel导入导出样式、自适应列宽、自适应行高

    一.先加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</a ...

  9. SpringBoot使用poi或EasyExcel导入导出Excel文件

    使用poi导入导出Excel 首先引入poi依赖包 03版本的Excel和07版本的Excel所需要的依赖不同,都需要导入. 记录问题: 最初导入的poi包为3.6版本.WorkBook类和Sheet ...

最新文章

  1. ByteBuf和相关辅助类
  2. jquery gridly (拖拽插件)
  3. 072_Math对象
  4. Prometheus学系列(十九)之PromQL基础
  5. django+mysql+插入数据库网页展示内容
  6. mongodb spring 超时时间_mongoDB(spring 部分配置)
  7. Go语言http服务器
  8. linux centos 系统php支持jpeg的安装方法
  9. 使用ASP.NET MVC Futures 中的异步Action 【转】
  10. java实现大写转小写_java实现将大写字母转换为小写字母
  11. JavaScript函数创建表格
  12. 互斥事件的概念和公式_相互独立事件与互斥事件的区别
  13. 以后有面试官问你「密码学」,你就把这篇文章扔给他
  14. Postgres SQL 中的 时间格式转化常识
  15. 鼎新TIPTOP GP5.25鼎捷易拓GP5.25视频教程26模块操作及开发
  16. CF Round 542 Div1.
  17. 关于实现联系人中英文名排序的问题
  18. 网络视频血战:弱者渔利
  19. 计算机系统基础:bomb炸弹实验
  20. 信号时域分析方法的理解(峰值因子、脉冲因子、裕度因子、峭度因子、波形因子和偏度等)

热门文章

  1. deiban9 安装redis_ᐅ IBAN-Rechner: IBAN einfach berechnen | Sparkasse.de
  2. IDEA Shelve Silently 静默搁置
  3. 下拉框的高度html,设置select下拉框高度的一种方法
  4. 深入剖析 fork 内核实现(Linux kernel 2.6.11)
  5. 统计学习方法读书笔记15-逻辑斯蒂回归习题
  6. 支付从业者转型路在何方?
  7. 向量与矩阵的范数(比较1-范数、2-范数、无穷范数、p-范数、L0范数 和 L1范数等)
  8. Golang 入门:详谈append函数
  9. 日志审计系统如何和服务器互联,服务器如何查看审计日志
  10. centos7配置mysql主从数据库