java-Excel导入导出数据-方法

一、Excel导入导出的应用场景

1、数据导入

减轻录入工作量

2、数据导出

统计信息归档

3、数据传输

异构系统之间数据传输

二、EasyExcel简介

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便

1、网站

2、EasyExcel特点

  • Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

四、在 spring-boot 应用

1、引入 pom.xml 依赖

<!-- excel 文件 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
</dependency>

2、建立 ExcelUtils 公共方法

@Slf4j
public class ExcelUtils {
/**
* 表格导出
*
* @param dataList 数据列表
* @param sheetName sheet页
* @param fileName 文件名
* @param tClass dataList 类型
* @param response
* @param <T>
*/
public static <T> void excelExport(List<T> dataList, String sheetName, String fileName, Class<T> tClass, HttpServletResponse response) {
try {
response.setContentType("application/vnd.ms-excel");
String contentDisposition = "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", contentDisposition);
response.setHeader("fileName", URLEncoder.encode(fileName, "UTF-8"));
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition,fileName");
// 使用 EasyExcel 构造 ExcelWriter
final ExcelWriter writer = EasyExcelFactory.write(response.getOutputStream(), tClass).autoCloseStream(Boolean.FALSE).build();
// 使用 EasyExcel 构造 WriteSheet
final WriteSheet sheet = EasyExcelFactory.writerSheet(sheetName).build();
writer.write(dataList, sheet);
writer.finish();
} catch (Exception e) {
log.error("excelExport error", e);
response.setHeader("content-Type", "application/json; charset=utf-8");
response.setCharacterEncoding("utf-8");
try {
response.getWriter().println(JSONUtil.toJsonStr(Result.ofErrorT(ResultCodeEnum.SYSTEM_EXECUTION_ERROR.getCode(), ResultCodeEnum.SYSTEM_EXECUTION_ERROR.getMsg())));
} catch (Exception ex) {
log.error("response.getWriter() error", ex);
}
}
}
/**
* @param file 文件数据
* @param zClass 接收文件数据类
* @param headRows 文件数据从哪一行开始
* @return
*/
public static <T> List<T> excelCopyEntities(MultipartFile file, Class<?> zClass, int headRows) throws IOException {
List<T> list = new ArrayList<>();
try {
//配置第几行开始读取数据
ImportParams params = new ImportParams();
params.setHeadRows(headRows);
list = ExcelImportUtil.importExcel(file.getInputStream(), zClass, params);
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(file.getInputStream());
}
return list;
}
}

3、建立 导入导出 字段实体类

注:@ExcelProperty(value="<对应的列名称>", index="<第几列:是从0开始算起>")

4、编写导入的伪代码

注:此导入不能导入过大的数据量(最好不要超过 mybatis-plus 的接受范围:5000,超过的话,需要在编写另外的读取excel方法,进行分批次导入)

5、编写导出的伪代码

posted @   yikes_ygr  阅读(400)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示