Invalid row number (65536) outside allowable range (0..65535)
把数据库里的数据导出成Excel文件时,报这个错误:Invalid row number (65536) outside allowable range (0..65535)
导出的文件类型是.xls,错误原因是因为.xls文件行数最长为65535,超过这个行数导出会出现错误。
在 Excel 早期版本中,默认的工作薄扩展名为".xls",:最大256(IV,2的8次方)列,最大65536(2的16次方)行;即横向256个单元格,竖向65536个单元格。
自 Office 2007 版本起,Excel 默认的工作薄扩展名为".xlsx",最大16384(XFD,2的14次方)列,最大1048576(2的20次方)行;
即横向16384个单元格,
竖向1048576个单元格。
解决办法:1、把HSSFWorkbook改为XSSFWorkbook,把导出文件类型改为.xlsx。
2、行数达到65535就换一页(sheet)
修改前的代码:
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet();
//添加表头
Row row1 = sheet.createRow(0);
row1.createCell(0).setCellValue("序号");
row1.createCell(1).setCellValue("资产名称");
row1.createCell(2).setCellValue("规格型号");
row1.createCell(3).setCellValue("计量单位");
row1.createCell(4).setCellValue("资产编号");
row1.createCell(5).setCellValue("批次号");
row1.createCell(6).setCellValue("生产厂家");
row1.createCell(7).setCellValue("资产状态");
row1.createCell(8).setCellValue("操作人");
row1.createCell(9).setCellValue("手机号");
row1.createCell(10).setCellValue("操作时间");
//添加内容
for (int i = 1; i < data.size()+1; i++) {
Row row = sheet.createRow(i);
List<String> rowData = data.get(i-1);
for (int j = 0; j < rowData.size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(rowData.get(j));
}
}
修改后的代码:
添加表头的代码不变
//添加数据,Excel一张(或者说一页)默认行数是65535,如果超过,要sheet分页
int sheetIndex = 0;//记录额外创建的sheet数量
Row row;
for (int i = 1; i < data.size()+1; i++) {
List<String> rowData = data.get(i-1);
//建新的sheet
if (i%65000 == 0){
sheet = workbook.createSheet();
row = sheet.createRow(0);
for (int j = 0; j < rowData.size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(rowData.get(j));
}
sheetIndex++;
}
//写入数据
row = sheet.createRow(i-sheetIndex*65000);
for (int j = 0; j < rowData.size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(rowData.get(j));
}
}
经过测试,问题解决,达到设置的行数会自动换一个sheet
参考:Invalid row number (65536) outside allowable range (0..65535)-CSDN博客