Java導出百萬級數據到Excel中
使用POI導出大批量數據到Excel操作步驟:
第一步: 你的自己準備一個大批量的數據 最好能超過65536條以上
分享一個SQL文件 鏈接:https://pan.baidu.com/s/13sL7hATEWUTZCqrUHAbzJA 提取碼:gp60
第二部: 開始編寫代碼,查詢所有的數據,將結果集出傳遞給導出的工具類進行導出
@RequestMapping("/export")
public void exportBigDataToExcel(User user,HttpServletRequest request, HttpServletResponse respose) {
// 創建時間格式變量後面要重新格式化日期時間
SimpleDateFormat sdf_1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 設置文件名稱
String exportFileName = "用戶信息";
// 根據條件獲取數據庫中的所有數據
List<User> bigDataList= userService.exportBigDataToExcel(user);
// 獲取數據總行
int totalRowNum = memberIntegralDtoList.size();
try {
//創建SXSSFWorkbook對象(excel的文檔對象)
SXSSFWorkbook wb = new SXSSFWorkbook();
/* 設定單個sheet的最大數據行數 博主選的是2003
提醒: excel單個sheet的最大行
2003版:65536行 256列;
2007版:1048576行 16384列;
2010版:1048576行 16384列;
2013版:1048576行 16384列 */
int maxRowNum = 60000;
// 根據查詢的數據總條數計算需要多少個sheet 來存儲數據
int sheets = totalRowNum % 60000 == 0 ? (totalRowNum / maxRowNum) : (totalRowNum / maxRowNum + 1);
// 循環創建sheet 並寫入數據
for (int i = 0; i < sheets; i++) {
// 創建SheetName
SXSSFSheet sheet = wb.createSheet("用戶" + i);
// 計算單sheet的數據起止範圍
int begin = (i - 1) * maxRowNum;
int end = maxRowNum * i;
// 此處需要進行結束數據範圍的比對 當 i=3時數據截止是18W 但我們查詢出來的數據是15W 就會異常 所以需要進行比對
end = Math.min(end, totalRowNum);
// 設定一個Excel的行數用來進行Excel數據寫入換行的
int num = 0;
// 最重要的 寫入數據到了
for (int j = begin; j < end; j++) {
// 定義一個Excel的行對象
SXSSFRow rowContent = null;
// 寫入表頭信息
if (num == 0) {
//在sheet裏創建第一行,參數爲行索引(excel的行),可以是0~60000之間的任何一個
SXSSFRow rowTitle = sheet.createRow(num);
//創建單元格並設置單元格內容
rowTitle.createCell(0).setCellValue("用戶編號");
rowTitle.createCell(1).setCellValue("用戶名稱");
rowTitle.createCell(2).setCellValue("用戶性別");
rowTitle.createCell(3).setCellValue("用戶電話");
rowTitle.createCell(4).setCellValue("用戶身份證");
rowTitle.createCell(5).setCellValue("家庭住址");
rowTitle.createCell(6).setCellValue("用戶暱稱");
rowTitle.createCell(7).setCellValue("用戶狀態");
}
rowContent = sheet.createRow(++num);
//在sheet裏創建第三行
rowContent.createCell(0).setCellValue(bigDataList.get(j).getUserId() == null ? "未知" : bigDataList.get(j).getUserId());
rowContent.createCell(1).setCellValue(bigDataList.get(j).getUserName() == null ? "未知" : bigDataList.get(j).getUserName());
rowContent.createCell(2).setCellValue(bigDataList.get(j).getUserSex() == null ? "未知" : bigDataList.get(j).getUserSex());
rowContent.createCell(3).setCellValue(bigDataList.get(j).getUserPhone() == null ? "未知" : bigDataList.get(j).getUserPhone());
rowContent.createCell(4).setCellValue(bigDataList.get(j).getUserCard() == null ? "未知" : bigDataList.get(j).getUserCard());
rowContent.createCell(5).setCellValue(bigDataList.get(j).getAddress() == null ? "未知" : bigDataList.get(j).getAddress());
rowContent.createCell(6).setCellValue(bigDataList.get(j).getNickName() == null ? "未知" : bigDataList.get(j).getNickName());
rowContent.createCell(7).setCellValue(bigDataList.get(j).getUserState() == null ? "未知" : bigDataList.get(j).getUserState());
}
}
//輸出Excel文件
OutputStream output = response.getOutputStream();
response.reset();
// 設置輸出類型和文件名稱
response.setHeader("Content-disposition", "attachment; filename="+exportFileName+".xls");
response.setContentType("application/msexcel");
wb.write(output);
output.close();
} catch (Exception e) {
e.getMessage();
}
logger.info("數據導出完成,共導出:"+totalRowNum+" 條數用戶信息")
}