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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!