Ⅰ poi讀取excel數據最大內存
題主是否想詢問「poi讀取excel數據最大內族悔祥存失敗是為什麼」?內部文件損壞。poi是一套用戶構建用戶界面的漸進式框架,是自底向上逐層應用,在該應用讀取excel數據過程中,顯兆搏示最大內存失敗的話,是因為應用文件包內部文件損壞,沒有熱補丁兼前配容導致的,出現這種情況應把poi文件包重新下載一遍即可。
Ⅱ EXCEL大數據量導出的解決方案
EXCEL大數據量導出的解決方案
將web頁面上顯示的報表導出到excel文件里是一種很常見的需求。潤乾報表的類excel模型,支持excel文件數據無失真的導入導出,使用起來非常的方便。然而,當數據量較大的情況下,excel本身的支持最多65535行數據的問題便凸顯出來。下面就給出大數據量導出到excel的解決方案。
首先,對於數據超過了65535行的問題,很自然的就會想到將整個數據分塊,利用excel的多sheet頁的功能,將超出65535行後的數據寫入到下一個sheet頁中,即通過多sheet頁的方式,突破了最高65535行數據的限定。
具體做法就是:
單獨做一個鏈接,使用JSP導出,在JSP上通過程序判斷報錶行數,超過65535行後分SHEET寫入。這樣這個問題就得以解決了。
更進一步地說,在這種大數據量的報表生成和導出中,要佔用大量的內存,尤其是在使用TOMCAT的情況下,JVM最高只能支持到2G內存,則會發生內存溢出的情況。此時的內存開銷主要是兩部分,一部分是該報表生成時的開銷,另一部分是該報表生成後寫入一個EXCEL時的開銷。由於JVM的GC機制是不能強制回收的,因此,對於此種情形,我們給出一個變通的解決方案。
首先,將該報表設置起始行和結束行參數,在API生成報表的過程中,分步計算報表,比如一張20萬行數據的報表,在生成過程中,可通過起始行和結束行分4-5次進行。這樣,就降低了報表生成時的內存佔用,在後面報表生成的過程中,如果發現內存不夠,即可自動啟動JVM的GC機制,回收前面報表的緩存。
導出EXCEL的過程,放在每段生成報表之後立即進行,改多個SHEET頁為多個EXCEL,即在分步生成報表的同時分步生成EXCEL,則通過POI包生成EXCEL的內存消耗也得以降低。通過多次生成,同樣可以在後面EXCEL生成所需要的內存不足時,有效回收前面生成EXCEL時佔用的內存。
再使用文件操作,對每個客戶端的導出請求在伺服器端根據SESSIONID和登陸時間生成唯一的臨時目錄,用來放置所生成的多個EXCEL,然後調用系統控制台,打包多個EXCEL為RAR或者JAR方式,最終反饋給用戶一個RAR包或者JAR包,響應客戶請求後,再次調用控制台刪除該臨時目錄。
使用這種方法,首先是通過分段運算和生成,有效降低了報表從生成結果到生成EXCEL的內存開銷。其次是通過使用壓縮包,響應給用戶的生成文件體積大大縮小,降低了多用戶並發訪問時伺服器下載文件的負擔,有效減少多個用戶導出下載時伺服器端的流量,從而達到進一步減輕伺服器負載的效果。
Ⅲ 關於Poi 大數據量Excel 導出時 文件過大的問題 怎麼解決
建議不要導出excel,當前excel中已經有支持cvs文件。
解釋:cvs文件的顯示方式和版xls的顯示方式一樣,並權且此顯示方式的執行效率要高於xls文件的額,因為cvs文件存儲的是數據直接直接用英文逗號分隔,xls是存儲的cell。所以在大量數據的情況下,都是導出為cvs文件。
備註:如果數據過多的話,建議可以分多次查詢導出,不要一次性導出,否則效率會很低。
-
Ⅳ poi讀取excel2007(大數據),然後保存到資料庫中
導致內存溢出是因為太多了內存不夠用,你可以先讀一部分然後做個標記,先把讀到的這部分數據寫入到資料庫里。然後再從標記處開始讀一部分再寫入,再讀再寫直到完。不要一次性全部讀完。
Ⅳ poi用hssflistner怎麼導出大excel數據
POI之前的版本不支持大數據量處理,如果數據過多則經常報OOM錯誤,有時候調整JVM大小效果也不是太好。3.8版本的POI新出來了SXSSFWorkbook,可以支持大數據量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。
3.8版本的POI對excel的導出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook用來處理較少的數據量,SXSSFWorkbook用來處理大數據量以及超大數據量的導出。
HSSFWorkbook的使用方法和之前的版本的使用方法一致,這里就不在陳述使用方法了
SXSSFWorkbook的使用例子如下:
import junit.framework.Assert;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
public static void main(String[] args) throws Throwable {
Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
Sheet sh = wb.createSheet();
for(int rownum = 0; rownum < 100000; rownum++){
Row row = sh.createRow(rownum);
for(int cellnum = 0; cellnum < 10; cellnum++){
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address); }
}
FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
wb.write(out);
out.close();
}
以前還用xml來處理,現在3.8以上就好辦了。
Ⅵ 關於Poi 大數據量Excel 導出時 文件過大的問題 怎麼解決
建議要導excel前excel已經支持cvs文件
解釋:cvs文件顯示式xls顯示式並且顯示式執行效率要高於xls文件額cvs文件存儲回數據直接直答接用英文逗號隔xls存儲cell所量數據情況都導cvs文件
備註:數據建議查詢導要性導否則效率低
-
Ⅶ java poi Excel大數據量導入怎麼提高速度
記得有個屬性,
POI3.8的SXSSF包是XSSF的一個擴展版本,支持流處理,在生成大數據量的電子表內格且堆空間有容限時使用。SXSSF通過限制內存中可訪問的記錄行數來實現其低內存利用,當達到限定值時,新一行數據的加入會引起老一行的數據刷新到硬碟。
比如內存中限制行數為100,當行號到達101時,行號為0的記錄刷新到硬碟並從內存中刪除,當行號到達102時,行號為1的記錄刷新到硬碟,並從內存中刪除,以此類推。
rowAccessWindowSize代表指定的內存中緩存記錄數,默認為100,此值可以通過
new SXSSFWorkbook(int rowAccessWindowSize)或SXSSFSheet.setRandomAccessWindowSize(int windowSize)來設置。
Ⅷ java excel poi 大數據量50W 內存溢出
Workbook workbook = new SXSSFWorkbook(1000);
poi有個機制 每次往內存中寫1000條數據,這個1000你可以改的 盡量別大於10000條數據,寫完1000條數據後再內重新寫,這樣就不會內存溢容出了。
Ⅸ POI處理Excel數據(2021-09-06)
導入兩個依賴:
需要簡輪根據表格裡面的對象建立實體類 ExcelDataVO ,並生成get和set方法激咐敬。
知識點:列印日誌
根據文件後綴名類型獲取對應的工作簿對象: getWorkBook
將單元格內容轉換為字元串: convertCellValueToString
CellType getCellType();
將單元格內明慎容轉換為字元串
Java中 DecimalFormat 用法詳解: https://www.cnblogs.com/Small-sunshine/p/11648652.html
提取每一行中需要的數據,構造成為一個結果數據對象: convertRowToData
解析Excel數據: parseExcel
讀取Excel文件內容 readExcel
Ⅹ POI讀取逐行讀取大數據量的Excel文件
https://gitee.com/ssh971202/util