導航:首頁 > 網路數據 > poi寫入大數據效率

poi寫入大數據效率

發布時間:2023-11-02 20:35:59

java怎麼在數據超過百萬後分頁導出

用過POI的人都知道,在POI以前的版本中並不支持大數據量的處理,如果數據量過多還會常報OOM錯誤,
這時候調整JVM的配置參數
也不是一個好對策(註:
jdk在32位系統中支持的內存不能超過2個G,而在64位中沒有限制,但是在64位的系統中,性能並不是太好
),好在POI3.8版本新出來了一個SXSSFWorkbook對象,它就是用來解決大數據量以及超大數據量的導入導出操作的,但是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式的Excel文件
這里普及一下,在POI中使用HSSF對象時,excel 2003最多隻允許存6553數據,一般用來處理較少的數據量,這時對於百萬級別數據,Excel肯定
容納不了,而且在計算機性能稍低的機器上測試,就很容易導致堆溢出。當我升級到XSSF對象時,它可以直接支持excel2007以上版本,因為它採用
ooxml格式。這時excel可以支持1048576條數據,單個sheet表就支持近104
萬條數據了,雖然這時導出100萬數據能滿足要求,但使用XSSF測試後發現偶爾還是會發生堆溢出,所以也不適合百萬數據的導出。現在我們知道excel2007及以上版本可以輕松實現存儲百萬級別的數據,但是系統中的大量數據是如何能夠快速准確的導入到excel中這好像是個難題,對於一般的web系統,我們為了解決成本,基本都是使用的入門級web伺服器tomcat,既然我們不推薦調整JVM的大小,那我們就要針對我們的代碼來解決我們要解決的問題。在POI3.8之後新增加了一個類,
SXSSFWorkbook
,採用當數據加工時不是類似前面版本的對象,它可以控制excel數據佔用的內存,他通過控制在內存中的行數來實現資源管理,即當創建對象超過了設定的行數,它會自動刷新內存,將數據寫入文件,
這樣導致列印時,佔用的CPU,和內存很少。但有人會說了,我用過這個類啊,他好像並不能完全解決,當數據量超過一定量後還是會內存溢出的,而且時間還很長。對你只是用了這個類,但是你並沒有針對你的需求進行相應的設計,僅僅是用了,所以接下來我要說的問題就是,如何通過SXSSFWorkbook以及相應的寫入設計來實現百萬級別的數據快速寫入。
我先舉個例子,以前我們[資料庫
中存在大量的數據,我們要查詢,怎麼辦?我們在沒有經過設計的時候是這樣來處理的,先寫一個集合,然後執行jdbc,將返回的結果賦值給list,然後再返回到頁面上,但是當數據量大的時候,就會出現數據無法返回,內存溢出的情況,於是我們在有限的時間和空間下,通過分頁將數據一頁一頁的顯示出來,這樣可以避免了[大數據
量數據對內存的佔用,也提高了用戶的體驗,在我們要導出的百萬數據也是一個道理,內存突發性佔用,我們可以限制導出數據所佔用的內存,
這里我先建立一個list容器,list中開辟10000行的存儲空間,每次存儲10000行,用完了將內容清空,然後重復利用
,這樣就可以有效控制內存,所以我們的設計思路就基本形成了,所以分頁數據導出共有以下3個步驟:
1、求資料庫中待導出數據的行數
2、根據行數求數據提取次數
3、按次數將數據寫入文件

② 關於Poi 大數據量Excel 導出時 文件過大的問題 怎麼解決

建議不要導出excel,當前excel中已經有支持cvs文件。
解釋:cvs文件的顯示方式和版xls的顯示方式一樣,並權且此顯示方式的執行效率要高於xls文件的額,因為cvs文件存儲的是數據直接直接用英文逗號分隔,xls是存儲的cell。所以在大量數據的情況下,都是導出為cvs文件。
備註:如果數據過多的話,建議可以分多次查詢導出,不要一次性導出,否則效率會很低。
-

③ java excel poi 大數據量50W 內存溢出

Workbook workbook = new SXSSFWorkbook(1000);
poi有個機制 每次往內存中寫1000條數據,這個1000你可以改的 盡量別大於10000條數據,寫完1000條數據後再內重新寫,這樣就不會內存溢容出了。

④ poi導出excel數據多導出慢

你是不是每寫一條數據都是要新建一個OutputStream 如果是這樣的話你就先把數據讀入到內存里 然後再在一個OutputStream里寫入到文件中 當前這樣做的前提是你的內存要夠用
如果你的內存不夠放6000條數據的話 可以先讀一部分數據到內存 然後在一個OutputStream中把數據寫入到文件中 然後再讀 再寫 這樣就會快了

⑤ 求教怎麼用讀取流操作Excel文件,不藉助jxl,poi等外部庫,數據量比較大,在20萬以上,保證內存不溢出。。

POI為apache公司的一個子項目,主要是提供一組操作windows文檔的Java API.
Java Excel俗稱是一開放源碼項目,通過它Java開發人員可以讀取Excel文件的內容、創建新的Excel文件、更新已經存在的Excel文件。使用該API非Windows操作系統也可以通過純Java應用來處理Excel數據表。因為是使用Java編寫的,所以我們在Web應用中可以通過JSP、Servlet來調用API實現對Excel數據表的訪問。

就這兩者的區別,主要談下JVM虛擬機內存消耗的情況.
數據量3000條數據,每條60列.JVM虛擬機內存大小64M.
使用POI:運行到2800條左右就報內存溢出.
使用JXL:3000條全部出來,並且內存還有21M的空間.
可想而知,在對內存的消耗方面差距還是挺大的.
也許是由於JXL在對資源回收利用方面做的還挺不錯的.
關於兩者效率方面,沒有研究過,我想這個也是基於大數據量而言的,數據量小的話基本上差別不大,也不難被發覺.但是大的數據量,POI消耗的JVM內存遠比JXL消耗的多.但相比提供的功能的話,JXL又相對弱了點.所以如果要實現的功能比較復雜的情況下可以考慮使用POI,但如果只想生成一些大數據量可以考慮使用JXL,或者CSV也是一個不錯的選擇,不過CSV並不是真正的excel.

⑥ 如何用java代碼生成一個大數據的excel文件

POI包解析 或者 只是xls的話 用 jxl 也行 poi 全支持 xls 和xlsx
然後寫入 保存 ok

HSSFSheet sheet= null;
(int sherrt= 0; sherrt <wr.getNumberOfSheets();sherrt++){
sheet = wr.getSheetAt(sherrt); // 獲得sheet工作簿HSSFSheet
for(int i = 0 ; i<=sheet.getLastRowNum(); i++){
HSSFRow row = sheet.getRow(i);//獲得行數
Iterator o = row.iterator(); //得到每行的值
int j= 0 ;
while(o.hasNext()){
if(!key){
kk = o.next().toString();
if(StrC.getSimilarityRatio(kk, Vle[j])>0.7){j++;}
}else{
GetVAR[j] = o.next().toString();
j++;
}
}
這個是得到 也可以寫入

⑦ java利用poi讀大數據量xlsx除了用xml方式讀取外,還有其他方法嗎

poi是把excel當做【文來檔】來處理源的,自然只有XSSFWorkbook類來操作它,也就是你說的xml方式。在poi的眼裡,excel文檔里的並不是【數據】而是【表格】。
你如果想要把excel當做【數據源】來處理,應該用odbc的方式,將你需要的excel文件變成一個odbc數據源,然後用ResultSet set = smt.executeQuery("select * from [sheet1$]");來讀取數據,效率跟access表現相當(畢竟excel有數據量上限,實際表現大多數時候都比access還要快)

⑧ java poi Excel大數據量導入怎麼提高速度

記得有個屬性,

POI3.8的SXSSF包是XSSF的一個擴展版本,支持流處理,在生成大數據量的電子表內格且堆空間有容限時使用。SXSSF通過限制內存中可訪問的記錄行數來實現其低內存利用,當達到限定值時,新一行數據的加入會引起老一行的數據刷新到硬碟。
比如內存中限制行數為100,當行號到達101時,行號為0的記錄刷新到硬碟並從內存中刪除,當行號到達102時,行號為1的記錄刷新到硬碟,並從內存中刪除,以此類推。
rowAccessWindowSize代表指定的內存中緩存記錄數,默認為100,此值可以通過
new SXSSFWorkbook(int rowAccessWindowSize)或SXSSFSheet.setRandomAccessWindowSize(int windowSize)來設置。

⑨ 如何提高poi讀寫excel文件(同一文件)的效率

我的代碼
//導入普通客戶信息

publicStringimportExcle(){

TEmployeeemployee=(TEmployee)request.getSession().getAttribute(

"employee");

TCustomerInfoc=newTCustomerInfo();

//聲明數據流

InputStreamis=null;

if(employee!=null){

inthang=0;

intlie=0;

if(excel!=null){

try{

//解析excel2007版本文件

is=newFileInputStream(excel);

XSSFWorkbookwork=newXSSFWorkbook(is);

XSSFSheetsheet=work.getSheetAt(0);

introws=sheet.getPhysicalNumberOfRows();

//循環表的行,從第二行開始


for(inti=1;i<rows;i++){

hang=i+1;

c=newTCustomerInfo();

XSSFRowrow=sheet.getRow(i);

if(row==null){//判斷是否為空

continue;

}

//讀取該行的每一列

for(intj=0;j<row.getPhysicalNumberOfCells();j++){

XSSFCellcell=row.getCell(j);

if(cell==null){

continue;

}

if(cell.toString()==null

||"".equals(cell.toString())){

continue;

}

Stringv=Util.getXssfCellValue(cell);

switch(j){//通過列數來判斷對應插如的欄位

case0:

c.setCompanyName(v);

break;

case1:

c.setLinkName(v);

break;

case2:

c.setTell(v);

break;

case3:

c.setTelephone(v);

break;

case4:

c.setPosition(v);

break;

case5:

c.setEmail(v);

break;

case6:

c.setCompanyType(v);

break;

case7:

c.setCustomerType(v);

break;

case8:

c.setCompanyDetail(v);

break;

}

c.setCreateMan(employee.getName());

c.setCreateDate(newDate());


}

customerInfoBiz.addCustomer(c);

}

request.setAttribute("message","導入成功(=^_^=)");


}catch(Exceptione){

System.out.println("進入---解析excel2003版本文件--錯誤拋出");

try{

//解析excel2003版本文件


is=newFileInputStream(excel);

HSSFWorkbookwork=newHSSFWorkbook(is);

HSSFSheetsheet=work.getSheetAt(0);

if(sheet!=null){

introws=sheet.getPhysicalNumberOfRows();

//循環表的行,從第二行開始

for(inti=1;i<rows;i++){

hang=i+1;

c=newTCustomerInfo();

HSSFRowrow=sheet.getRow(i);

if(row==null){//判斷是否為空

continue;

}

//循環表格的列

for(shortj=0;j<row

.getPhysicalNumberOfCells();j++){

HSSFCellcell=row.getCell(j);

if(cell==null){

continue;

}

if(cell.toString()==null||"".equals(cell.toString())){

continue;

}

Stringv=Util.getHssfCellValue(cell);

switch(j){//通過列數來判斷對應插如的欄位

case0:


c.setCompanyName(v);

break;

case1:


c.setLinkName(v);

break;

case2:


c.setTell(v);

break;

case3:


c.setTelephone(v);

break;

case4:


c.setPosition(v);

break;

case5:


c.setEmail(v);

break;

case6:


c.setCompanyType(v);

break;

case7:


c.setCustomerType(v);

break;

case8:


c.setCompanyDetail(v);

break;

}

c.setCreateMan(v);

c.setCreateDate(newDate());

}

customerInfoBiz.addCustomer(c);

}

request.setAttribute("message","導入成功(=^_^=)");

}

}catch(Exceptione1){

request.setAttribute("message","第"+hang+"行,第"

+lie+"列開始導入失敗,請注意導入格式!!");

e1.printStackTrace();

}

}

}

}else{

request.setAttribute("message","登錄超時,請重新登錄!!");

}

//查詢時對象中含有值對查詢有誤

if(customer!=null){

customer=null;

}


returncustomerList();

}

⑩ 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寫入大數據效率相關的資料

熱點內容
蘋果6s桌面圖標輕微抖動 瀏覽:326
如何刪除手機中看不見的臨時文件 瀏覽:469
安卓412原生鎖屏apk 瀏覽:464
書加加緩存文件在哪裡 瀏覽:635
dock是word文件嗎 瀏覽:267
社保公司新辦去哪個網站下載資料 瀏覽:640
三維標注數據怎麼填寫 瀏覽:765
數據線斷在哪裡取出來 瀏覽:522
word最好的文件 瀏覽:345
大數據聚類資料庫 瀏覽:247
網站關停域名怎麼注銷 瀏覽:456
適合微信閱讀的手機報 瀏覽:114
win10設置應用許可權管理 瀏覽:47
wordpress製作單頁網站導航頁面 瀏覽:277
什麼海外網站可以看限製片 瀏覽:596
指尖見app在哪裡下載 瀏覽:367
java聊天室課程設計 瀏覽:670
responsejavascript 瀏覽:71
如何從殺毒軟體裡面恢復出文件 瀏覽:972
越獄iphone如何備份 瀏覽:124

友情鏈接