阿里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();
// 设置多个sheet
setMutilSheet(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,当前行等数据
*/
@Override
public void invoke(Object object, AnalysisContext context) {
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(object);
//根据业务自行 do something
doSomething();
/*
如数据过大,可以进行定量分批处理
if(datas.size()<=100){
datas.add(object);
}else {
doSomething();
datas = new ArrayList<Object>();
}
*/
}
/**
* 根据业务自行实现该方法
*/
private void doSomething() {
}
@Override
public 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);
}
990

被折叠的 条评论
为什么被折叠?



