JAVA 匯出Excel大資料記憶體溢位解決方案

2021-08-21 04:41:47 字數 2636 閱讀 3779

最初的匯出用的就是easypoi(easypoi官網:簡單方便,當時也沒考慮太多,就圖乙個簡單

後來發生了幾次匯出大資料的時候伺服器直接崩掉,使我不得不注意起來

上網查了一下,基本上就是記憶體溢位的問題

然後發現了乙個比較好的解決方法,就是使用xml規範來匯出excel

首先我們需要知道一下,xml的格式是怎樣的

新建乙個excel**,隨便新增一點資料;

檔案->另存為->檔案格式改為xml工作表。

開啟我們的xml檔案,就可以清晰的看到xml的格式了,接下來我們只需要按照基本格式對資料進行封裝就可以

因為我這個系統的匯出只涉及到了資料,也沒有太多複雜的東西,所以我只對最基本的匯出功能部分**做了乙個封裝,有更加深入的需求的朋友可以以這個為基礎重新開發或者進行優化

首先是寫乙個統一的匯出方法,不同的實體不同的資料都可以呼叫的乙個方法

}接著我們寫實際的xml的拼接方法,將傳入的資料拼接成正確的xml

// 每個sheet顯示的資料行數 (因為是xls格式**,我們將每個sheet設定為最多顯示60000行資料)

private

static final int recordcount = 60000;

private

static stringbuffer createexcelxml (class<?> clazz, list<?> list, dataoutputstream rafs) throws ioexception

for (int j = count; j < total; j ++)

index ++;

count ++;

if (index > recordcount || index == recordcount) break;

}" + "1"

+ "false

false"

+ ""); // 每乙個工作簿輸出一次,釋放資源,防止記憶體溢位 (如果這裡不加這個**,拼接完成了資料量還是很大,匯出的時候還是會報記憶體溢位的異常。你甚至可以將這個數值設定的更小一些)

rafs.write(stringbuffer.tostring().getbytes());

rafs.flush();

stringbuffer.setlength(0);

}return stringbuffer;

}

獲取實體類需要匯出的屬性的個數,及匯出後**中對應的**頭

(對了,忘了說,這個匯出的功能是基於@excel註解做的)

private

static mapgetcolumnandtitle (class<?> clazz)

}map.put("column", column);

map.put("titlelist", list);

return

map;

}

再就是獲取屬性的值了,如果是日期格式的,對日期進行格式化

(格式化基於@excel註解的exportformat屬性)

private static void getproperty (object obj, class<?> clazz, list datalist)  else 

} else

if (replace.length > 0) else

} catch (nosuchmethodexception e) catch (illegalacces***ception e) catch (illegalargumentexception e) catch (invocationtargetexception e) }}

}

在實際中,我們會把某些值以id_name的方式儲存到資料庫,這時,在我們匯出的時候,就需要進行乙個值的替換

(替換基於@excel註解的replace屬性)

private static string isreplace (string  replace, string id) 

}return result;

}

@excel具體屬性及用法在easypoi官網有詳細介紹

到這裡,通過xml方式匯出excel的工具類就結束了,能夠實現最基本的匯出功能,如果有特殊需要的就自己再改改吧

還有哦,這個匯出來的**是會首行凍結的,我挺喜歡這個的,要是不要就自己琢磨下吧

測試十四萬條資料匯出沒任何問題

時間上基本主要耗時的是查詢的時間,因為資料量太大了查詢需要一段時間,匯出的時間倒是很快,幾秒鐘的樣子

具體的我也不知道,反正伺服器不會崩╮(╯▽╰)╭

java資料excel匯出

第一步 先重資料庫查詢出所需要的資料字段內容 第二步 上面那個方法呼叫了excel匯出工具方法 public int outexcel string path,string headertitle,list datalist else if path.endswith xlsx else 第二步,在...

Java 匯出資料到Excel

連線mysql資料庫,查詢出資料,並匯出資料到excel public static void main string args 以filename為檔名來建立乙個workbook wwb workbook.createworkbook file 建立工作表 writablesheet ws wwb...

Java資料匯出到excel

這裡只能從顯示資料的jsp頁面上匯出當前頁面的資料,這些資料可以從資料庫讀出,顯示到jsp頁面,然後加一段話就可把當前頁面資料儲存到excel裡面 如從後台過來資料顯示到 showuser.jsp 然後加鏈結到 showexcel.jsp就可以了,在這個頁面只多了幾行字,其他的都不會顯示包括頁面!但...