Java使用POI導出大數據量Excel

背景

今天須要寫一個導出的Excel的功能,可是發現當數據量到3萬條時,列數在23列時,內存溢出,CPU使用100%,測試環境直接炸掉。在本地測試時發現,導出3000條左右的數據的時候,堆內存瞬間升高500M左右。而後發現了SXSSFWorkbook這個類。bash

簡介

SXSSFWorkbook 須要poi-ooxml3.8及以上開始支持,我這邊適使用的是3.9版本,本質是一個XSSFWorkbook類(Excel2007),它使用的方式是採用硬盤空間來大幅下降堆內存的佔用,在系統的臨時文件夾目錄建立一個臨時文件,而後將全部大於約定行數的數據都存入臨時文件,而不是所有放在內存中,內存中只存放最新的的約定條數的數據,從而實現以硬盤空間換取內存空間,避免內存溢出測試

使用方式

與正常的Excel導出方法沒有區別,只是將實例化的類換爲SXSSFWorkbookspa

SXSSFWorkbook workbook = null;
			OutputStream outputStream = null;
			try {
				outputStream = response.getOutputStream();
				//建立工做簿
				workbook = new SXSSFWorkbook();
				// 打開壓縮功能 防止佔用過多磁盤
				workbook.setCompressTempFiles(true);

				// 建立一個工做表
				Sheet sheet = workbook.createSheet("表名");
				// 建立一行
				Row titleRow = sheet.createRow(0);
				// 建立一個單元格
				Cell cell = titleRow.createCell(0);
				// 給單元格賦值
				cell.setCellValue("內容");

				// 將工做簿寫入輸出流
				workbook.write(outputStream);
			} catch (Exception e) {
				e.printStackTrace();
			}finally {
				if (workbook != null) {
					//使用完畢後將產生的臨時文件刪除 防止將磁盤搞滿
					workbook.dispose();
				}
				if (outputStream != null) {
					outputStream.close();
					
				}


			}

複製代碼

注意點

  • 最好開啓壓縮模式 workbook.setCompressTempFiles(true); 這樣能夠使得臨時文件體積大幅減小code

  • 使用完畢後釋放 workbook.dispose(); 防止臨時文件一直增長 撐爆硬盤xml

相關文章
相關標籤/搜索