Java导出百万条数据到Excecl

2023-12-14 20:54:27

背景:项目中遇到了把百万条数据导出到excel中的业务,发现只能导出65536行

研究发现:
Excel 2003版:zhi列数dao最大256(IV,2的8次方)列,行数最大65536(2的16次方)行;

Excel 2007版:列数最大16384(XFD,2的14次方),行数最大1048576(2的20次方);

Excel 2013版:列数最大16384(XFD,2的14次方),行数最大1048576(2的20次方);

在改造过程中,发现单线程查询非常耗时,会导致超时,而且一次性拿百万条数据放到list中,会OOM。

最终解决方案:多线程+多sheet页+分页查询,我这里数据100W条,通过浏览器直接下载。废话不多说,直接上代码
ExportExcelController.java

@Autowired
private ExportExcelService exportExcelService;

//param参数是你业务需要的一些参数
@PostMapping("/exportExcel")
public void exportExcel(@RequestBody ExportParam param, HttpServletResponse response){
   
    exportExcelService.exportExcel(param,response);
  }

ExportExcelService.java

void exportExcel(ExportParam param, HttpServletResponse response) {
   
//表头数据,根据自己实际业务
List<Map<String,Object>> tableTitleInfoList;

//查询需要导出的总数
long count =  exportExcelMapper.getCount();
//2007版Excel最大行数是1048576,表头占用一行,数据最大占用1048575,超过后进行分sheet
//sheet页数
 long sheet =  (count + 1048574) / 1048575;
// 创建工作簿
SXSSFWorkbook workbook = new SXSSFWorkbook();
List<SXSSFSheet> sheets = new ArrayList<>();
for (int i =1 ;i<= sheet;i++) {
   
 // 创建数据 sheet
  SXSSFSheet dataSheet = workbook.createSheet("数据"+i);
  //将第一列隐藏,根据自己的业务可不加,我这里导出的时候把表的id也导出了,但不给看给隐藏了
  dataSheet.setColumnHidden(0</

文章来源:https://blog.csdn.net/weixin_49456013/article/details/135001644
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。