亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java通過導出超大Excel文件解決內存溢出問題

 更新時間:2021年09月26日 10:11:36   作者:冰子杍  
導出excel是咱Java開發(fā)的必備技能,下面這篇文章主要給大家介紹了關于Java通過導出超大Excel文件解決內存溢出問題的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

將業(yè)務數據導出到Excel表中,導出任務數據量較大時,導出的項目就會內存溢出,本文通過Java操作Poi的SXSSFWorkbook類進行導出,解決內存溢出問題。

1.采用Poi中的SXSSFWorkbook

在實現excel導出時,在數據量過大的情況下,總是容易發(fā)生內存溢出的情況??梢允褂肞OI提供的 SXSSFWorkbook 類來避免內存溢出。

2.maven中引入Poi

		<!-- poi start -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>4.1.2</version>
		</dependency>
		<!-- poi end -->

3.測試過程

先使用普通的寫法測試(XSSFWorkbook),編寫writeNormalExcelTest測試方法,寫入的行數太多時,會報內存溢出(在設置-server -Xmx64m -Xms64m -Xmn32m的情況下)。

接著編寫SXSSFWorkbook操作excel的測試,測試方法writeHugeExcelTest(同樣在設置-server -Xmx64m -Xms64m -Xmn32m的情況下),結果證明無內存溢出,能完好的導出1000000行測試數據,整個Java類代碼如下:

4.單元測試Java代碼

package cn.gzsendi.exceltest;

import java.io.FileOutputStream;
import java.io.IOException;

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.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

public class HugeExcelExportTest {
	
	private int totalRowNumber = 1000000; //寫入的excel數據行數
	private int totalCellNumber = 40; //excel每行共40列
	
	//普通的寫入excel的方法,會消耗內存,寫入的行數太大時,會報內存溢出
	@Test
	public void writeNormalExcelTest(){
	
	   Workbook wb = null;
	   FileOutputStream out = null;
		
	   try {

		   long startTime = System.currentTimeMillis();
	        
	       wb = new XSSFWorkbook();
	       Sheet sheet = wb.createSheet("Sheet 1");
	        
	       //定義Row和Cell變量, Rows從0開始.
	       Row row;
	       Cell cell;
	        
	       for (int rowNumber = 0; rowNumber < totalRowNumber; rowNumber++) {
	    	   row = sheet.createRow(rowNumber);
	           for (int cellNumber = 0; cellNumber < totalCellNumber; cellNumber++) {
	        	   cell = row.createCell(cellNumber);
	               cell.setCellValue(Math.random()); //寫入一個隨機數
	           }
	            
	           //打印測試,
	           if(rowNumber % 10000 ==0) {
	        	   System.out.println(rowNumber);
	           }
	       }
	
	       //Write excel to a file
	       out = new FileOutputStream("d:\\temp\\normalExcel_" + totalRowNumber + ".xlsx");
	       wb.write(out);
	       long endTime = System.currentTimeMillis();
	        
	       System.out.println("process " + totalRowNumber + " spent time:" + (endTime - startTime) + " ms.");
	
	    } catch (Exception e) {
	    	
	       e.printStackTrace();
	        
	    } finally {
	    	
	    	
	    	try {
				if(out != null) out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
	    	
		    try {
		    	if(wb != null) wb.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
	    	
	    }
		
	}
	
	//結合臨時文件壓縮等寫入excel,默認超過100行就寫到臨時文件,不會報內存溢出
	@Test
	public void writeHugeExcelTest(){

        SXSSFWorkbook wb = null;
        FileOutputStream out = null;
        
        try {
        	
        	long startTime = System.currentTimeMillis();
        	
            wb = new SXSSFWorkbook();//默認100行,超100行將寫入臨時文件
            wb.setCompressTempFiles(false); //是否壓縮臨時文件,否則寫入速度更快,但更占磁盤,但程序最后是會將臨時文件刪掉的
            Sheet sheet = wb.createSheet("Sheet 1");
            
            //定義Row和Cell變量, Rows從0開始.
	        Row row;
	        Cell cell;
	        
	        for (int rowNumber = 0; rowNumber < totalRowNumber; rowNumber++) {
	        	
	        	row = sheet.createRow(rowNumber);
	        	for (int cellNumber = 0; cellNumber < totalCellNumber; cellNumber++) {
	                cell = row.createCell(cellNumber);
	                cell.setCellValue(Math.random()); //寫入一個隨機數
	            }
	        	
	        	
	        	//打印測試,
	            if(rowNumber % 10000 ==0) {
	            	System.out.println(rowNumber);
	            }
	        	
	        }
            
	        //Write excel to a file
	        out = new FileOutputStream("d:\\temp\\hugeExcel_" + totalRowNumber + ".xlsx");
	        wb.write(out);

	        long endTime = System.currentTimeMillis();
	        
	        System.out.println("process " + totalRowNumber + " spent time:" + (endTime - startTime) + " ms.");
            
        } catch (Exception ex) {
        	
            ex.printStackTrace();
            
        } finally {
        	
            if (wb != null) {
            	wb.dispose();// 刪除臨時文件,很重要,否則磁盤可能會被寫滿
            }
            
            try {
				if(out != null) out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
	    	
		    try {
		    	if(wb != null) wb.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		    
        }
		
	}

}

5.結論

導出excel數據量大時,采用SXSSFWorkbook進行操作,數據達到一定數據將寫數據到臨時文件,不會一直占用內存,因此不會報內存溢出

到此這篇關于Java通過導出超大Excel文件解決內存溢出問題的文章就介紹到這了,更多相關Java導出超大Excel文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot超詳細分析啟動流程

    SpringBoot超詳細分析啟動流程

    今天小編就為大家分享一篇關于SpringBoot整個啟動過程的分析,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2022-07-07
  • JVM內存溢出和內存泄漏的區(qū)別及說明

    JVM內存溢出和內存泄漏的區(qū)別及說明

    這篇文章主要介紹了JVM內存溢出和內存泄漏的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Mybatis批量刪除數據操作方法

    Mybatis批量刪除數據操作方法

    MyBatis的作用我想不用多說,今天說說MyBatis中的批量刪除操作。 非常不錯,感興趣的朋友一起看看吧
    2016-09-09
  • Java基礎之反射原理與用法詳解

    Java基礎之反射原理與用法詳解

    這篇文章主要介紹了Java基礎之反射原理與用法,結合實例形式詳細分析了java反射的相關概念、原理、使用方法與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • 基于Java+SpringBoot實現人臉識別搜索

    基于Java+SpringBoot實現人臉識別搜索

    人臉識別搜索技術作為現代計算機視覺領域的重要研究方向之一,已經在多個領域展現出巨大的應用潛力,隨著信息技術的飛速發(fā)展,人臉識別搜索在多個領域得到了廣泛關注和應用,本文旨在探討人臉識別搜索技術的背景、原理以及其在實際應用中的意義和挑戰(zhàn)
    2023-08-08
  • Spring Data JPA帶條件分頁查詢實現原理

    Spring Data JPA帶條件分頁查詢實現原理

    這篇文章主要介紹了Spring Data JPA帶條件分頁查詢實現原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java實現字符串反轉

    Java實現字符串反轉

    這篇文章介紹了Java實現字符串反轉的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • Java中如何利用Set判斷List集合中是否有重復元素

    Java中如何利用Set判斷List集合中是否有重復元素

    在開發(fā)工作中,我們有時需要去判斷List集合中是否含有重復的元素,這時候我們不需要找出重復的元素,我們只需要返回一個?Boolean?類型就可以了,下面通過本文給大家介紹Java中利用Set判斷List集合中是否有重復元素,需要的朋友可以參考下
    2023-05-05
  • MyBatis自定義映射關系和關聯查詢實現方法詳解

    MyBatis自定義映射關系和關聯查詢實現方法詳解

    這篇文章主要介紹了MyBatis自定義映射關系和關聯查詢實現方法,當POJO屬性名與數據庫列名不一致時,需要自定義實體類和結果集的映射關系,在MyBatis注解開發(fā)中,使用@Results定義并使用自定義映射,使用 @ResultMap使用自定義映射
    2023-04-04
  • 詳解java中Reference的實現與相應的執(zhí)行過程

    詳解java中Reference的實現與相應的執(zhí)行過程

    不知道大家知不知道特殊的reference對象都是被jvm專門處理的,所以這篇文章就相應的工作流程和referencequeue之間的協作進行梳理.有需要的朋友們可以參考借鑒。
    2016-09-09

最新評論