SpringBoot(十四)導出Excel

来源:https://www.cnblogs.com/toutou/archive/2018/12/02/9857963.html
-Advertisement-
Play Games

用JavaPOI導出Excel時,我們會考慮到Excel版本及數據量的問題。針對不同的Excel版本,要採用不同的工具類。HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,擴展名是.xls;XSSFWorkbook:是操作Excel2007的版本,擴展名是.xlsx。用過... ...


用JavaPOI導出Excel時,我們會考慮到Excel版本及數據量的問題。針對不同的Excel版本,要採用不同的工具類。HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,擴展名是.xls;XSSFWorkbook:是操作Excel2007的版本,擴展名是.xlsx。

用過POI的人都知道,在POI以前的版本中並不支持大數據量的處理,如果數據量過多還會常報OOM錯誤,這時候調整JVM的配置參數也不是一個好對策(註:jdk在32位系統中支持的記憶體不能超過2個G,而在64位中沒有限制,但是在64位的系統中,性能並不是太好),好在POI3.8版本新出來了一個SXSSFWorkbook對象,它就是用來解決大數據量以及超大數據量的導入導出操作的,但是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式的Excel文件。

這裡普及一下,在POI中使用HSSF對象時,excel 2003最多只允許存儲65536條數據,一般用來處理較少的數據量,這時對於百萬級別數據,Excel肯定容納不了,而且在電腦性能稍低的機器上測試,就很容易導致堆溢出。而當我升級到XSSF對象時,它可以直接支持excel2007以上版本,因為它採用ooxml格式。這時excel可以支持1048576條數據,單個sheet表就支持近104萬條數據了,雖然這時導出100萬數據能滿足要求,但使用XSSF測試後發現偶爾還是會發生堆溢出,所以也不適合百萬數據的導出。

現在我們知道excel2007及以上版本可以輕鬆實現存儲百萬級別的數據,但是系統中的大量數據是如何能夠快速準確的導入到excel中這好像是個難題,對於一般的web系統,我們為瞭解決成本,基本都是使用的入門級web伺服器tomcat,既然我們不推薦調整JVM的大小,那我們就要針對我們的代碼來解決我們要解決的問題。在POI3.8之後新增加了一個類,SXSSFWorkbook,採用當數據加工時不是類似前面版本的對象,它可以控制excel數據占用的記憶體,他通過控制在記憶體中的行數來實現資源管理,即當創建對象超過了設定的行數,它會自動刷新記憶體,將數據寫入文件,這樣導致列印時,占用的CPU,和記憶體很少。但有人會說了,我用過這個類啊,他好像並不能完全解決,當數據量超過一定量後還是會記憶體溢出的,而且時間還很長。對你只是用了這個類,但是你並沒有針對你的需求進行相應的設計,僅僅是用了,所以接下來我要說的問題就是,如何通過SXSSFWorkbook以及相應的寫入設計來實現百萬級別的數據快速寫入。

v修改pom.xml

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>

v添加controller

package com.demo.controller;

import com.demo.pojo.UserDetails;
import com.demo.service.UserService;
import org.apache.poi.hssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * Created by toutou on 2018/11/3.
 */
@Controller
public class FileController {
    @Autowired
    UserService userService;

    @RequestMapping(value = "export")
    public void Export(HttpServletResponse response) throws IOException {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("信息表");
        List<UserDetails> classmateList = userService.getUserDetails();

        // 設置要導出的文件的名字
        String fileName = "users"  + new Date() + ".xls";

        // 新增數據行,並且設置單元格數據
        int rowNum = 1;

        // headers表示excel表中第一行的表頭 在excel表中添加表頭
        String[] headers = { "id", "uid", "地址", "城市"};
        HSSFRow row = sheet.createRow(0);
        for(int i=0;i<headers.length;i++){
            HSSFCell cell = row.createCell(i);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }

        //在表中存放查詢到的數據放入對應的列
        for (UserDetails item : classmateList) {
            HSSFRow row1 = sheet.createRow(rowNum);
            row1.createCell(0).setCellValue(item.getId());
            row1.createCell(1).setCellValue(item.getUid());
            row1.createCell(2).setCellValue(item.getAddress());
            row1.createCell(3).setCellValue(item.getCity());
            rowNum++;
        }

        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        response.flushBuffer();
        workbook.write(response.getOutputStream());
    }
}

v運行與調試

SpringBoot(十四)導出Excel

SpringBoot(十四)導出Excel

 

其他參考原文資料:


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專註於基礎平臺的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是PyQuery PyQuery是一個類似於jQuery的解析網頁工具,使用lxml操作xml和html文檔,它的語法和jQuery很像。和XPATH,Beautiful Soup比起來,PyQuery更加靈活,提供增加節點的class信息,移除某個節點,提取文本信息等功能。 初始化PyQuer ...
  • 一.行為型模式 創建型模式基於對象的創建機制,隔離了對象的創建細節,使代碼能夠與要創建的對象的類型相互獨立 結構型模式用於設計對象和類的結構,使它們可以相互協作以獲得更大的結構 行為型模式主要關註對象的責任,用來處理對象之間的交互,以實現更大的功能 二.理解觀察者模式 觀察者模式是一種行為型模式,在 ...
  • 隨著電腦革命的發展,“不安全”的編程方式已逐漸成為編程代價高昂的主因之一。 C++引入了構造囂(constructor)的概念,這是一個在創建對象時被自動調用的特殊方法。Java中也採用了構造器,並額外提供了“垃圾回收器”。對於不再使用的記憶體資源,垃圾回收器能自動將其釋放。 5.1 用構造器確保初 ...
  • 概述 spring boot starter actuator:是一個用於暴露自身信息的模塊,主要用於監控與管理。 為了保證actuator暴露的監控介面的安全性,需要添加安全控制的依賴spring boot start security依賴,訪問應用監控端點時,都需要輸入驗證信息。 關鍵配置: A ...
  • 有關Python解釋器的信息 與所有其他模塊一樣,必須使用import語句導入sys模塊,即 。 sys模塊提供有關Python解釋器的常量,函數和方法。dir(系統)給出了可用常量,函數和方法的摘要。另一種可能是help()函數。使用help(sys)提供有價值的詳細信息。 模塊sys中,例如,最 ...
  • socket的使用 socket.socket(網路層ip協議蔟,傳輸層協議類型,預設協議) socket的通信過程 socket的應用 ...
  • 協程: 協程,又稱微線程,纖程。英文名Coroutine。 可以在不同的函數間切換,而且切換的次數和時間都是由用戶自己確定的。 協程的幾種實現方式: (1)使用生成器yield實現。 如果不瞭解生成器可以閱讀我的另一篇文章:python生成器的簡單理解 下麵就來寫一個簡單的協程程式。 這段代碼的執行 ...
  • Java開發學習心得(二):Mybatis和Url路由 序號接上一篇 "Java開發學習心得(一):SSM環境搭建" 1.3 Mybatis MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...