阿里EasyExcel导入导出
阿里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导入导出相关推荐
- EasyExcel导入导出下载模板(带下拉)
EasyExcel导入导出网上资料很多,这里就不多做描述了,总之就是一款比较轻而小,易用的excel操作工具包:这里在项目中使用到,做下笔记.以及表格中下拉框的实现: 声明:本文思路是借鉴于某大神的, ...
- 【使用EasyExcel导入导出】
使用EasyExcel导入导出 一,为什么要使用EasyExcel 1.1 EasyExcel与Poi的区别 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个 ...
- 使用阿里开源的EasyExcel导入导出EXCEL——工具类
工具类 package com.example.demo.util.excel;import com.alibaba.excel.EasyExcel; import com.alibaba.excel ...
- Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了!
欢迎关注方志朋的博客,回复"666"获面试宝典 一.EasyExcel EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据 ...
- Spring Boot + EasyExcel 导入导出,好用到爆!
今日推荐 Java 8 一行代码解决了空指针问题,太厉害了...List中remove()方法的陷阱,被坑惨了!25000 字详解 23 种设计模式,原来可以这么简单!最牛逼的 Java 日志框架,性 ...
- easyExcel导入导出(列锁定单元格、表头合并、导出类型限制、锁定单元格增加底色、设置密码、隐藏列等)
easyexcel官网文档:https://www.yuque.com/easyexcel/doc/easyexcel easyexcel {maven 版本} GitHub网址:https://gi ...
- Easyexcel导入导出多个sheet
EasyExcel对于导入导出的操作十分简洁,记录一下多个sheet且内容不一致的导入导出. 引入 easyExcel依赖 <dependency><groupId>com.a ...
- EasyExcel导入导出样式、自适应列宽、自适应行高
一.先加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</a ...
- SpringBoot使用poi或EasyExcel导入导出Excel文件
使用poi导入导出Excel 首先引入poi依赖包 03版本的Excel和07版本的Excel所需要的依赖不同,都需要导入. 记录问题: 最初导入的poi包为3.6版本.WorkBook类和Sheet ...
最新文章
- ByteBuf和相关辅助类
- jquery gridly (拖拽插件)
- 072_Math对象
- Prometheus学系列(十九)之PromQL基础
- django+mysql+插入数据库网页展示内容
- mongodb spring 超时时间_mongoDB(spring 部分配置)
- Go语言http服务器
- linux centos 系统php支持jpeg的安装方法
- 使用ASP.NET MVC Futures 中的异步Action 【转】
- java实现大写转小写_java实现将大写字母转换为小写字母
- JavaScript函数创建表格
- 互斥事件的概念和公式_相互独立事件与互斥事件的区别
- 以后有面试官问你「密码学」,你就把这篇文章扔给他
- Postgres SQL 中的 时间格式转化常识
- 鼎新TIPTOP GP5.25鼎捷易拓GP5.25视频教程26模块操作及开发
- CF Round 542 Div1.
- 关于实现联系人中英文名排序的问题
- 网络视频血战:弱者渔利
- 计算机系统基础:bomb炸弹实验
- 信号时域分析方法的理解(峰值因子、脉冲因子、裕度因子、峭度因子、波形因子和偏度等)
热门文章
- deiban9 安装redis_ᐅ IBAN-Rechner: IBAN einfach berechnen | Sparkasse.de
- IDEA Shelve Silently 静默搁置
- 下拉框的高度html,设置select下拉框高度的一种方法
- 深入剖析 fork 内核实现(Linux kernel 2.6.11)
- 统计学习方法读书笔记15-逻辑斯蒂回归习题
- 支付从业者转型路在何方?
- 向量与矩阵的范数(比较1-范数、2-范数、无穷范数、p-范数、L0范数 和 L1范数等)
- Golang 入门:详谈append函数
- 日志审计系统如何和服务器互联,服务器如何查看审计日志
- centos7配置mysql主从数据库