java百万条数据导出到excel表格
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表格相关推荐
- java后台将数据导出到Excel表格
简单粗暴直接贴代码,把所有主要代码全部糅合在一块展示出来: /** * 设置导出xls文件的表头 */ public static final String[ ...
- 阿里开源(EasyExcel):使用Java将数据导出为Excel表格、带样式----》java web下载 Excel文件
目录 一.技术选型 二.实现过程 1.导入依赖 2.编写工具类 EasyExcelUtil 3.公用参数类 EasyExcelParams 4.表格样式实体类 MyWriteHandler 5.数据实 ...
- php 链接excel表格数据,php 怎么把数据导出到excel表格?php 连接 excel表格数据库数据...
php 怎么把数据导出到excel表格 php 把数据导出到excel表多种方法如使用 phpExcel 等,以下代码是直接通 header 生成 excel 文件的代码示例: header(&quo ...
- 查询php 输出表格,php输出excel表格数据-PHP如何将查询出来的数据导出成excel表格(最好做......
PHP如何将查询出来的数据导出成excel表格(最好做... php 把数据导出excel表格有多种方法,使用 phpExcel 等,以下代码接通过 header 生成 excel 文件的代码示例: ...
- 2021-08-01数据导出到Excel表格
数据导出到Excel表格 https://www.cnblogs.com/zhangzhiyong-/p/13376527.html package com.jxmcloud.business.sho ...
- 【纯干货】SSM 实现将数据导出为 Excel 表格(利用反射实现类型通配)
0. 这里假设 SSM 环境已经搭建完成 1. 需要三个依赖包 <!-- 导出为 Excel --> <dependency><groupId>org.apache ...
- 如何优化百万级别数据导出(excel 文件)
如何优化百万级别数据导出(excel 文件) 背景 未优化前存在的问题 业务接口流程 优化后 业务接口流程(优化版v1) 业务接口流程(优化版v2) 优化效果 复盘 宏观层面 遇到的困难 收获 代码实 ...
- vb 读取oracle中的表格数据,如何将数据库信息读取导出excel表格中-VB 从SQL数据库中把数据导出到Excel表格中,怎么写?...
VB 从SQL数据库中把数据导出到Excel表格中,怎么写? INSERT INTO OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Data Source=&q ...
- 百度指数常见php框架,怎么导出数据到excel表格-如何将百度指数数据导出到Excel表格...
如何将百度指数数据导出到Excel表格 第一步:打开CAD.CAD命令行输入"Li"."选择对象"选需要提取坐标的多段线.回车. 第二步:将CAD文本框中的数据 ...
最新文章
- MySQL的information_schema
- 一行js_不用引入JQuery,前端开发们一行代码就能使用的提示信息开源组件
- matlab 句柄图像尝试
- 生成pfx文件需要在服务器上执行,PEM文件和private.key文件生成IIS服务器所需的pfx文件(配置SSL用)...
- 如何用堆栈和循环结构代替递归调用--递归转换为非递归的10条军规
- 这款Python王者编辑器,集Pycharm和Sublime优点于一身
- django 学习 (二) 模板
- 《移动通信》学习总结
- PHP+MySQL实现新闻管理系统
- 2022年最全公关活动策划案例(共14份)
- 国际国内cms系统开源网址大综合
- mapreduce求平均值
- 微信防封域名处理 淘客类 检测域名是否被封
- 收藏的一些有意思的网站
- Unity知识点整理
- POI读取Excel转为HTML文件
- 51单片机实战教程之C语言基础(五 C语言函数及其定义)
- 小学四年级计算机考试题,小学四年级信息技术试卷题库.doc
- 假设linux分配给u盘设备名是,习题04_Linux磁盘管理
- Android应用利用libusb设备通信权限问题