Java导出Excel百万条数据表格数据实现分页easyexcel方法和apach poi方法
创始人
2025-05-30 09:05:00

注意: 此导出excel样式只是简单设置而已

1、创建实体类 ExcelModel 导出数据库对应实体数据列表

简单样式设计

MAVEN仓库依赖或者下载依赖jar包


com.alibabaeasyexcel3.1.1
@Data
@ContentRowHeight(21)   //行高
@HeadRowHeight(30)  //excel内头高度
@ColumnWidth(15)  //每列宽度public class ExcelModel {@ExcelIgnore		//忽略此表头内容private Integer id;// 主键ID@ExcelProperty(value = "姓名") //表头内容private String name;// 姓名@ExcelProperty(value = "年龄")private Integer age;// age@ExcelProperty(value = "地址")private String address;// 地址@ExcelProperty(value = "性别")private String sex;// 性别@ExcelIgnore	private Integer pageStartIndex;//起始索引 查询索引位置@ExcelIgnore	private Integer pageSize;//每页数量  相当于数据库内数据步长
}

1.1创建mapper接口

@Param 选择 引入 import org.apache.ibatis.annotations.Param;

	Integer selecttxxxCount(@Param("model")ExcelModel  model);List selectData(@Param("model")ExcelModel   model);	

1.2创建mapper.xml

			

2、创建 services 实现类

客户端是下载的作用,数据的处理是在服务器端进行的

xxxClass    类   作用接收前端传递来的对应数据参数 比如 页码、每页大小 其他筛选条件等
xxxentity   类对应的实例
xxxMapper   对应的mapper文件名
//响应输出流在下方使用了  这个就不用了
ServletOutputStream outputStream = response.getOutputStream();

2.1、方法1==》核心代码 分页写入–适应数据量百万

select * from table_name  limit  startIndex,step
举例  select * from table_name  limit 15,1000xxxentity.setPageStartIndex(i * page_size);   ---对应起始索引
xxxentity.setPageSize(page_size);			--对应查询的记录行数
//核心代码public void exportExcelData(HttpSession session, HttpServletResponse response, xxxClass xxxentity) throws Exception {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename="+new Date()+"defineExcelName.xlsx");//查询总条数List total = xxxMapper.selecttxxxCount(xxxentity);       //计算页数// 定义每个sheet数据数量int page_size = 3000;//计算将分多少页int export_pagenumber = total % page_size > 0 ? total / page_size + 1 : total / page_size;//创建输出流 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), ExcelModel.class).build();for (int i = 0; i < export_pagenumber; i++) {WriteSheet writeSheet = new WriteSheet();	//创建工作簿writeSheet.setSheetName("第"+(i+1)+"页");xxxentity.setPageStartIndex(i * page_size);  //某处起始索引  (固定步长行数*第几个i)xxxentity.setPageSize(page_size);//从起始索引开始对应的截取数据 step 步长行数List dataList = xxxMapper.selectData(xxxentity);//每循环一次  查出的数据进行写入一个sheet 工作簿excelWriter.write(dataList,writeSheet);}//循环结束   excelWriter.finish();//整个Excel文件写数据结束response.flushBuffer();//强制刷新}

2.2、方法2==》一次性写入 --适应数量1万左右

//核心代码public void exportExcelData(HttpSession session, HttpServletResponse response, xxxClass xxxentity) throws Exception {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename="+new Date()+"defineExcelName.xlsx");//一次性查询数据List dataList= xxxMapper.selectData(xxxentity);//循环结束   EasyExcel.write(response.getOutputStream(), ExcelModel.class).sheet("单个sheet工作簿名称").doWrite(dataList);}

2.3、代码误区 ----其实这种方法本质是一次性写入 --错误

导致内存溢出(OOM)

 List datalist = new ArrayList<>();for (int i = 0; i < export_pagenumber; i++) {xxxentity.setPageStartIndex(i * page_size);xxxentity.setPageSize(page_size);List list= xxxMapper.selectData(xxxentity);datalist.addAll(list.subList(0,list.size()));//将查询出的集合集中收集在datalist}
EasyExcel.write(response.getOutputStream(), ExcelModel.class).sheet("单个sheet工作簿名称").doWrite(dataList);

3、性能比较

在这里插入图片描述

4、导出excel

在这里插入图片描述

5、oom 内存溢出

6、sax模式

SAX解析器读取输入文档并在处理文档时将每个事件推给文档处理器(MyContentHandler)。与DOM相比,SAX解析器能提供更好的性能优势,它提供对XML文档内容的有效低级访问。SAX模型最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,这使SAX解析器可以解析大于系统内存的文档。另外,你无需像在DOM中那样为所有节点创建对象。最后,SAX“推”模型可用于广播环境,能够同时注册多个ContentHandler,并行接收事件,而不是在一个管道中一个接一个地进行处理。

7、apach poi 有机会说 --适应小数据量

相关内容

热门资讯

今日重大通报“微友互娱其实真有... 您好:微友互娱这款游戏可以开挂,确实是有挂的,需要软件加微信【6355786】,很多玩家在微友互娱这...
科普实测“约战麻将到底有没有挂... 您好:约战麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【69174242】很多玩家在约战麻...
[第一财经]“钱塘十三水有没有... 您好:钱塘十三水这款游戏可以开挂,确实是有挂的,需要软件加微信【3671900】很多玩家在这款游戏中...
经验总结“十三道开挂脚本”[必... 您好:十三道这款游戏可以开挂,确实是有挂的,需要软件加微信【3398215】很多玩家在这款游戏中打牌...
重大通报“新玉海楼其实真有透视... 您好:新玉海楼这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4770480】很多玩家在新玉海楼...