JAVA解析Excel工具EasyExcel

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

1.jar包 

    <!-- Excel模板导出依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

2.实体

@Data
//@ContentRowHeight(50) // 设置 Cell 高度 为50
//@HeadRowHeight(40)    //  设置表头 高度 为 40
public class Student {/*** value: 表头名称* index: 列的号, 0表示第一列*///@ColumnWidth(40) // 设置 Cell 宽度@ExcelProperty(value = "学生姓名",index = 0)private String name;@ExcelProperty(value = "学生年龄",index = 1)private String age;@ExcelProperty(value = "性别",index = 2)private String nameGender;@ExcelProperty(value = "修改时间",index = 4)private Date updateTime;@ExcelIgnore  //忽略这个字段private List<SubjectPersonnel> subjectPersonnels;
}

3.导出代码实现(controller )

    @GetMapping("exportExcel")public void exportExcel(HttpServletResponse response) throws Exception {//1.获取要导出的数据List<Student> data =studentService.queryDataAll();//下载到浏览器默认地址ServletOutputStream out = response.getOutputStream();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date = simpleDateFormat.format(new Date());//导出文件的名字String fileName=new String((("学生")+date).getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)+".xlsx";//添加响应头信息,swagger会有乱码,正常的web不会有 response.setHeader("Content-disposition", "attachment; filename=" + fileName);response.setContentType("application/msexcel;charset=UTF-8");//设置类型response.setHeader("Pragma", "No-cache");//设置头response.setHeader("Cache-Control", "no-cache");//设置头response.setDateHeader("Expires", 0);//设置日期头//第一个参数是路径,第二个是参数实体类的classEasyExcel.write(out, Student.class).sheet("学生").doWrite(data);}

 4.读取excel(实现监听器)

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.util.ConverterUtils;
import com.sn.execel.dao.StudentDao;
import com.sn.execel.entity.Student;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** @program: execel* @description: 监听器类中处理读取的数据* @author: shenning* @create: 2020-08-20 10:34*/
//有个很重要的点 ExcelListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class ExcelListener extends AnalysisEventListener<Student> {/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;/*** 这个集合用于接收 读取Excel文件得到的数据*/private List<Student> studentList = new ArrayList<Student>();private StudentDao studentDao;public ExcelListener() { }/**** 不要使用自动装配* 在测试类中将dao当参数传进来*/public ExcelListener(StudentDao studentDao) {this.studentDao = studentDao;}/*** 加上存储数据库*/private void saveData() {//在这个地方可以调用daofor(int i=0,j=studentList.size();i<j;i++){studentDao.insertOne(studentList.get(i));}}/*** 一行一行的读取(Excel第一行不会读取)* @param data* @param context*/@Overridepublic void invoke(Student data, AnalysisContext context) {//数据存储到list,供批量处理,或后续自己业务逻辑处理。studentList.add(data);if(studentList.size()>=BATCH_COUNT){saveData();//存储完成清理 liststudentList.clear();}}/*** 读取完成之后做的事情,都会来调用* @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//这里也要保存数据,确保最后遗留的数据也存储到数据库if(studentList.size()>0){saveData();//存储完成清理 liststudentList.clear();}}/*** 读取Excel 表头* @param headMap* @param context*/@Overridepublic void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {invokeHeadMap(ConverterUtils.convertToStringMap(headMap, context), context);}
}

5.controller

    //我这就是dao层,应该会service层@Autowiredprivate StudentDao studentDao;/*** 导入* @param file* @throws Exception*/@PostMapping("readExcel")public void readExcel(MultipartFile file) throws Exception {//方法上传文件InputStream inputStream = file.getInputStream();//实例化实现了AnalysisEventListener接口的类ExcelListener excelListener = new ExcelListener(studentDao);/*** 参数1 要读取的文件* 参数2 要读取的数据对应的实体类类对象* 参数3 监听器对象 可以在创建的时候把dao当做参数传进去*/EasyExcel.read(inputStream,Student.class,excelListener).sheet().doRead();}

java百万条数据导出到excel表格相关推荐

  1. java后台将数据导出到Excel表格

    简单粗暴直接贴代码,把所有主要代码全部糅合在一块展示出来: /**     * 设置导出xls文件的表头          */         public static final String[ ...

  2. 阿里开源(EasyExcel):使用Java将数据导出为Excel表格、带样式----》java web下载 Excel文件

    目录 一.技术选型 二.实现过程 1.导入依赖 2.编写工具类 EasyExcelUtil 3.公用参数类 EasyExcelParams 4.表格样式实体类 MyWriteHandler 5.数据实 ...

  3. php 链接excel表格数据,php 怎么把数据导出到excel表格?php 连接 excel表格数据库数据...

    php 怎么把数据导出到excel表格 php 把数据导出到excel表多种方法如使用 phpExcel 等,以下代码是直接通 header 生成 excel 文件的代码示例: header(&quo ...

  4. 查询php 输出表格,php输出excel表格数据-PHP如何将查询出来的数据导出成excel表格(最好做......

    PHP如何将查询出来的数据导出成excel表格(最好做... php 把数据导出excel表格有多种方法,使用 phpExcel 等,以下代码接通过 header 生成 excel 文件的代码示例: ...

  5. 2021-08-01数据导出到Excel表格

    数据导出到Excel表格 https://www.cnblogs.com/zhangzhiyong-/p/13376527.html package com.jxmcloud.business.sho ...

  6. 【纯干货】SSM 实现将数据导出为 Excel 表格(利用反射实现类型通配)

    0. 这里假设 SSM 环境已经搭建完成 1. 需要三个依赖包 <!-- 导出为 Excel --> <dependency><groupId>org.apache ...

  7. 如何优化百万级别数据导出(excel 文件)

    如何优化百万级别数据导出(excel 文件) 背景 未优化前存在的问题 业务接口流程 优化后 业务接口流程(优化版v1) 业务接口流程(优化版v2) 优化效果 复盘 宏观层面 遇到的困难 收获 代码实 ...

  8. vb 读取oracle中的表格数据,如何将数据库信息读取导出excel表格中-VB 从SQL数据库中把数据导出到Excel表格中,怎么写?...

    VB 从SQL数据库中把数据导出到Excel表格中,怎么写? INSERT INTO OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Data Source=&q ...

  9. 百度指数常见php框架,怎么导出数据到excel表格-如何将百度指数数据导出到Excel表格...

    如何将百度指数数据导出到Excel表格 第一步:打开CAD.CAD命令行输入"Li"."选择对象"选需要提取坐标的多段线.回车. 第二步:将CAD文本框中的数据 ...

最新文章

  1. MySQL的information_schema
  2. 一行js_不用引入JQuery,前端开发们一行代码就能使用的提示信息开源组件
  3. matlab 句柄图像尝试
  4. 生成pfx文件需要在服务器上执行,PEM文件和private.key文件生成IIS服务器所需的pfx文件(配置SSL用)...
  5. 如何用堆栈和循环结构代替递归调用--递归转换为非递归的10条军规
  6. 这款Python王者编辑器,集Pycharm和Sublime优点于一身
  7. django 学习 (二) 模板
  8. 《移动通信》学习总结
  9. PHP+MySQL实现新闻管理系统
  10. 2022年最全公关活动策划案例(共14份)
  11. 国际国内cms系统开源网址大综合
  12. mapreduce求平均值
  13. 微信防封域名处理 淘客类 检测域名是否被封
  14. 收藏的一些有意思的网站
  15. Unity知识点整理
  16. POI读取Excel转为HTML文件
  17. 51单片机实战教程之C语言基础(五 C语言函数及其定义)
  18. 小学四年级计算机考试题,小学四年级信息技术试卷题库.doc
  19. 假设linux分配给u盘设备名是,习题04_Linux磁盘管理
  20. Android应用利用libusb设备通信权限问题

热门文章

  1. matlab 使得三维图形可以手动旋转,三维图形的平移,旋转与错切
  2. yarn ignore-engines
  3. java camel exchange类_让Camel处理各种URI类型
  4. 令人头疼的优化问题——多目标规划问题matlab求解
  5. matlab批量修改文件扩展名
  6. luogu P4233 射命丸文的笔记
  7. Flutter中解决AndroidX包与Support包冲突问题
  8. spring(@RequestPart)同时上传表单数据和文件
  9. 普通人如何通过积分落户北京? 2021北京积分落户分析必看
  10. apache 配置http跳转https