首頁
博客
研修院
VIP
APP
問答
下載
社區
推薦頻道
活動
招聘
專題
打開CSDN APP
Copyright ? 1999-2020, CSDN.NET, All Rights Reserved
打開APP
大數據導出excel大小限制_java 導出Excel 大數據量,自己經驗總結! 原創
2020-12-19 01:58:16
weixin_39655377
碼齡5年
關註
分析導出實現代碼,XLSX支持:
/*** 生成XLSX,2007版本的excel,每個sheet無6.5W的行數限制,但是到了壹定數量,可能內存溢出,
* 次方法適合在預計10W以下的數據導出時使用,本機測試,14W可以導出。列數量在8列左右
*
*@paramfileOut
* 輸出流
*@paramsheetMap
* 要設置的數據信息
*@throwsSQLException*/
public static voidcreateXSLXByResultSet(OutputStream fileOut, WriteXLSBean... beans)throwsSQLException {try{//重點 Workbook
Workbook wb = newXSSFWorkbook();for (int i = 0, len = beans.length; i < len; i++) {
WriteXLSBean xlsBean=beans[i];
Sheet sheet=wb.createSheet(xlsBean.getSheetName());
ResultSet rs=xlsBean.getRs();
ResultSetMetaData rsmd=rs.getMetaData();
TypeHandlerRegistry tr=BeanContext.tr;
Map th =xlsBean.getTh();int index = 0;while(rs.next()) {long t1 =System.currentTimeMillis();
org.apache.poi.ss.usermodel.Row row=sheet
.createRow(index);for (int j = 0, numberOfColumns = rsmd.getColumnCount(); j < numberOfColumns; j++) {
String key= rsmd.getColumnLabel(j + 1).toLowerCase();if(th.containsKey(key)) {
TypeHandler> type =tr.getTypeHandler(JdbcType
.forCode(rsmd.getColumnType(j+ 1)));
Object obj=type.getResult(rs, key);
row.createCell(j).setCellValue(obj== null ? "": obj.toString());
}
}
System.out.println(index+ " :"
+ (System.currentTimeMillis() -t1));
index++;
}
}//重點 Workbook
wb.write(fileOut);
}catch(IOException e) {
e.printStackTrace();throw new ServiceRunTimeException("生產xls文檔錯誤", e);
}finally{
}
}
在上面 標註了重點的兩處,分別是:
1.構建壹個Excel對象
2.將該對象寫入壹個OutPutStream
而在構建過程中,沒有地方寫入OutPutSteam ,也就是說必須在內存中構建整個 Excel,才能進行寫出操作,在大數據量情況下,這樣將導致所有數據加載到內存中,而不能輸出,導致最後 內存溢出。
根據運行環境不用,可能內存溢出的 情況不同
根據情況,如果數據量達到10W以上,建議使用
1、多個Excel,每個Excel壹個Sheet,因為所有Sheet都是Workbook的組成部分。如果不分多個Excel,即使分Sheet也沒用,
2、每個Excel中列數適中,比如: 5W行每個Excel檔,實現分多次導出和分頁查詢原理壹樣
3、對多個Excel導出到壹個臨時目錄,並通過程序壓縮,然後提供給客戶下載
2003版通過數據庫結果存到List中,然後進行生產:Table 就是List Row 是Map
/*** 生產xls,2003版本的excel,每個sheet有6.5W的行數限制
*
*@paramfileOut
* 輸出流,未關閉
*@paramsheetMap
* 要導出的數據信息*/
public static void createXSLByMap(OutputStream fileOut, Map>>sheetMap) {try{
HSSFWorkbook wb= newHSSFWorkbook();
Set keys =sheetMap.keySet();for (Iterator iterator =keys.iterator(); iterator
.hasNext();) {
String SheetKey=iterator.next();
Sheet sheet=wb.createSheet(SheetKey);
List> sheetRows =sheetMap.get(SheetKey);for (int i = 0, len = sheetRows.size(); i < len; i++) {
Map cellMap =sheetRows.get(i);
Set cellSet =cellMap.keySet();
org.apache.poi.ss.usermodel.Row row=sheet.createRow(i);int j = 0;for (Iterator iterCell =cellSet.iterator(); iterCell
.hasNext(); j++) {
String cellKey=iterCell.next();
Object obj=cellMap.get(cellKey);
row.createCell(j).setCellValue(obj== null ? "": obj.toString());
}
}
}
wb.write(fileOut);
}catch(IOException e) {
e.printStackTrace();throw new ServiceRunTimeException("生產xls文檔錯誤", e);
}finally{
}
}
新版本 POI+office 2007版本excel可以導出幾十萬條而不內存溢出,詳細見:
導出大量數據到 excel 的 xlsx文件
static String src="abcdefafslfelgtryjukjhgfdadertjDSFGHJKJGHFERTUIOabcdefafslfelgtryjukjhgfdadertjDSFGHJKdertjDSFGHJKJGHFERTUIOabcdefafslfelgtryjukjhgfdadertjDSFGHJKJGHFERTUIO";
public static void main(String[] args) throwsThrowable {
SXSSFWorkbook wb = new SXSSFWorkbook(100); //這裏100是在內存中的數量,如果大於此數量時,會寫到硬盤,以避免在內存導致內存溢出
Sheet sh =wb.createSheet();
for (int rownum = 0; rownum < 1000000; rownum++) {
Row row =sh.createRow(rownum);
for (int cellnum = 0; cellnum < 10; cellnum++) {
Cell cell =row.createCell(cellnum);
String address = newCellReference(cell).formatAsString();
cell.setCellValue(address+src.substring(rownum%10*10+1, (rownum%10+1)*10));
}
}
File file = new File("F:/aa.xlsx");
file.createNewFile();
FileOutputStream out = newFileOutputStream(file);
wb.write(out);
out.close();
}
內存使用情況:
根據以上前輩經驗,自己在結果自身需求考慮,整合出壹個工具。解決了excle表.xls格式行數65535行的限制。我實現的形式是導出壹張表,裏面有多頁
(我是已65000為壹頁)
這裏是用反射來使用所有傳入進行的實體的屬性的值。這裏只針對String和基本數據類型。如有自己定義的類型需要自己加上。
packagecom.tommy.fundation.util;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;public classRelectUtil {public static List reflectEntity(T model,Class> cals) throwsNoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchFieldException{
List list = new ArrayList();
Field[] field= model.getClass().getDeclaredFields(); //獲取實體類的所有屬性,返回Field數組
for(int j=0 ; j
String nam = field[j].getName(); //獲取屬性的名字
String name =nam;
name= name.substring(0,1).toUpperCase()+name.substring(1);
String type= field[j].getGenericType().toString(); //獲取屬性的類型
if(type.equals("class java.lang.String")){ //如果type是類類型,則前面包含"class ",後面跟類名
Method m = model.getClass().getMethod("get"+name);
String value= (String) m.invoke(model); //調用getter方法獲取屬性值
if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.lang.Integer")){
Method m= model.getClass().getMethod("get"+name);
Integer value=(Integer) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.lang.Short")){
Method m= model.getClass().getMethod("get"+name);
Short value=(Short) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.lang.Double")){
Method m= model.getClass().getMethod("get"+name);
Double value=(Double) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.lang.Boolean")){
Method m= model.getClass().getMethod("get"+name);
Boolean value=(Boolean) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}if(type.equals("class java.util.Date")){
Method m= model.getClass().getMethod("get"+name);
Date value=(Date) m.invoke(model);if(value != null){
list.add(value);
}else{
list.add("");
}
}
}returnlist;
}
}
下面將是重點實現導出excel表
packagecom.tommy.fundation.util;importjava.io.OutputStream;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;importjavax.servlet..alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.0.5</version> </d...
繼續訪問
...到excel文件(xls格式),附實驗結果(單張sheet最多可有65536行)& Fi...
使用POI導出MySQL數據庫數據到excel文件(xls格式) 註意事項:單張sheet最多存儲65536行!否則報錯! Caused by: java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535) !
使用Apache POI導出百萬條EXCEL數據_橙樂果果的博客
工作中,有這麽壹個需求:每天淩晨00:05分定時從數據庫導出大於三個月的訂單流水信息,保存為excel文件。 Just do it. 1.引入POM依賴 <!-- excel --> <!-- /artifact/org.apache.poi/poi --> ...
Linux下讀寫文件操作
Linux下讀寫文件操作 #include<stdio.h> typedef struct Student { int no; char name[10]; int score; }Student; int main(int args,char *argv[]) { //打開文件 FILE *fp=fopen("test.txt","w"); if(fp=NULL) { perror("fopen"); ...
繼續訪問
Java導出超大Excel文件,防止內存溢出
Java導出超大Excel文件,防止內存溢出1.采用Poi中的SXSSFWorkbook2.maven中引入Poi3.測試過程4.單元測試Java代碼5.結論 將業務數據導出到Excel表中,導出任務數據量較大時,導出的項目就會內存溢出,本文通過Java操作Poi的SXSSFWorkbook類進行導出,解決內存溢出問題。 1.采用Poi中的SXSSFWorkbook 在實現excel導出時,在數據量過大的情況下,總是容易發生內存溢出的情況。可以使用POI提供的 SXSSFWorkbook 類來避免內存溢
繼續訪問
Apache Poi導出Excel多Sheet頁詳解!_奧鵬馬的博客
apache poi是目前比較常用導出excel的方式。最近想要實現壹個導出excel多sheet頁的功能。 網上查了壹下大多都是針對某個具體對象的導出,不能實現任意對象的導出。現在將自己研究出的代碼貼出來,供大家參考。 //註意:此處實現的關鍵是將...
Apache poi 導出多sheet的excel表格_朋態圈的博客
導出多sheet的excel */public class ApachePoi { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub exportExcel();} @SuppressWarnings("resource") public static String exportExcel...
java導出excel限制大小_解決java poi導出excel2003不能超過65536行的問題
/*** 如果達到50000條數據則重新創建工作表的邏輯*/@Overridepublic void exportExcel(ListformList, ServletOutputStream outputStream){try{//工作表名後面的數字,如表1,表2int i = 0;//記錄總行數int rownum = 0;//記錄每個sheet的行數int tempnum = 0;//分頁條...
繼續訪問
熱門推薦 java poi 導出Excel 超大數據量解決方案
.test; import java.io.BufferedWriter; import java.io.File; import java.io...
繼續訪問
Excel單元格數據超過32767報錯問題處理
java poi 32767
繼續訪問
SXSSFWorkbook Excel 大量數據導出
註意 SXSSFWorkbook 用於大量數據的導出 SXSSFWorkbook是用來生成海量excel數據文件,主要原理是借助臨時存儲空間生成excel, SXSSFWorkbook專門處理大數據,對於大型excel的創建且不會內存溢出的,就只SXSSFWorkbook了。 它的原理很簡單,用硬盤空間換內存(就像hashmap用空間換時間壹樣)。 SXSSFWorkbook是streami...
繼續訪問
EXCEL大數據量導出的解決方案
將web頁面上顯示的報表導出到excel文件裏是壹種很常見的需求。然而,當數據量較大的情況下,excel本身的支持最多65535行數據的問題便凸顯出來。下面就給出大數據量導出到excel的解決方 案。 首先,對於數據超過了65535行的問題,很自然的就會想到將整個數據分塊,利用excel的多sheet頁的功能,將超出65535行後的數據寫入到下壹個sheet頁中,即通過多sheet頁的方式,突破了...
繼續訪問
幾行代碼,復雜Excel 導入導出,真心強大!
點擊上方藍色字體,選擇“標星公眾號”優質文章,第壹時間送達項目中使用:功能介紹IMPORT1、 ExcelHandle核心處理器;2、 ExcelWorkbookManageexcel所有工作表管理;3、 ExcelInitConfig配置文件初始化;4、 AbstractFileParser文件轉換類;alanpoi import有何優勢?1、 用戶不需要額外引入poi...
繼續訪問
java中poi導出excel問題總結
java中poi導出excel問題總結
繼續訪問
java POI導出excel,列數限制在256列
有兩篇文章寫得比較好的 /p/4c6eec65fdc3
繼續訪問
apache poi導出excel最大多少個sheet
大數據導出excel大小限制
寫評論
評論
收藏
點贊
踩
分享