国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot實現導出Excel功能

這篇具有很好參考價值的文章主要介紹了SpringBoot實現導出Excel功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

SpringBoot實現導出Excel功能

1 問題背景

需求要做一個導出excel的功能

2 前言

  1. 本篇著重闡述后端怎么實現,前端實現的部分只會粗略闡述。該實現方案是經過生產環(huán)境考驗的,不是那些拿來練手的小demo。本文闡述的方案可以借鑒用來做畢設或者加到自己玩的項目中去。
  2. 再次聲明,本文是百萬級數據量的企業(yè)級解決方案,不是學校里面的畢設或者自己搭環(huán)境玩玩的小demo。客戶不會去一頁一頁地點擊導出,本文闡述的是一鍵導出幾千行甚至上萬行的數據。如果本文與你了解到的方案有出入可以在評論區(qū)交流,像那種導出幾行或十來行的方案就不要說了。
  3. 有讀者在評論里提問“請教百萬行能撐住嗎?”筆者沒有去驗證,有興趣或者有疑問的讀者可以去驗證下,本文的解決方案是導出幾千或上萬行數據。本文也只是想介紹電商生產環(huán)境中真實的需求以及真實的解決方案,如果要導出百萬行,那就只能采用異步方式去進行導出了,文末有提供思路。

3 實現思路

  1. 后端查詢要導出的數據,此處簡稱data
  2. 使用阿里的EasyExcel組件將data寫到HttpServletResponse里面,返回指定的響應頭、響應內容的類型、字符編碼。響應出去的數據是二進制數據,此處簡稱bytes數據
  3. 前端使用前端框架提供的方法,將 bytes數據轉成blob,然后生成下載地址,然后進行下載

4 后端實現

要引入阿里的EasyExcel依賴,此處不贅述

<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>2.1.7</version>
		</dependency>

下面是excel文件要保存的信息,需要指定列頭

@Data
public class UserInfoVO {
  @ExcelProperty(value = "用戶ID",index = 0)
  private Long id;
  @ExcelProperty(value = "用戶姓名",index = 1)
  private String username;
  @ExcelProperty(value = "性別",index = 2)
  private String sex;
}

導出的偽代碼如下:

  @PostMapping("/xx/xxx/xxx")
  public void export(HttpServletResponse reponse) {
        // 設置響應頭等
        response.setHeader("Content-Disposition", "attachment;filename=" + "文件名(隨便定義).xlsx");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");

        // 查數據,假如要導出UserInfo的列表信息
        List<UserInfoVO> data = selectData();
       // 導出數據 
       EasyExcel.write(response.getOutputStream()).head(UserInfoVO.class).sheet().doWrite(data);
  }

5 設置Excel自適應列寬

思路:實現easyexcel提供的類并重寫方法,寫數據到HttpServletReponse的時候注冊一個自適應列寬的bean

實現AbstractColumnWidthStyleStrategy類,如下所示:

public class CustomCellWriteWeightConfig extends AbstractColumnWidthStyleStrategy {

    private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (needSetWidth) {
            Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
            if (maxColumnWidthMap == null) {
                maxColumnWidthMap = new HashMap<>();
                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
            }

            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
            if (columnWidth >= 0) {
                if (columnWidth > 254) {
                    columnWidth = 254;
                }

                Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
                    maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
                    Sheet sheet = writeSheetHolder.getSheet();
                    sheet.setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
                }

            }
        }
    }

    /**
     * 計算長度
     * @param cellDataList
     * @param cell
     * @param isHead
     * @return
     */
    private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            return cell.getStringCellValue().getBytes().length;
        } else {
            CellData cellData = cellDataList.get(0);
            CellDataTypeEnum type = cellData.getType();
            if (type == null) {
                return -1;
            } else {
                switch (type) {
                    case STRING:
                        // 換行符(數據需要提前解析好)
                        int index = cellData.getStringValue().indexOf("\n");
                        return index != -1 ?
                                cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1;
                    case BOOLEAN:
                        return cellData.getBooleanValue().toString().getBytes().length;
                    case NUMBER:
                        return cellData.getNumberValue().toString().getBytes().length;
                    default:
                        return -1;
                }
            }
        }
    }
}

注冊自適應列寬的組件:

EasyExcel.write(response.getOutputStream())
                    .head(SubscriptionOrderExportResp.class)
                    //  注冊自適應列寬組件
                    .registerWriteHandler(new CustomCellWriteWeightConfig())
                    .sheet()
                    .doWrite(data);

6 方案優(yōu)缺點

優(yōu)點:實現簡單,輕量級。能快速迭代上線 。

缺點:使用了同步方式返回數據,如果excel文件的數據量很多,那么將耗費很多時間,甚至http連接已經斷開了還未響應出去。

改進:本文解決方案是采用了同步方式導出,實時返回excel文件。可以做一個異步方式,后端創(chuàng)建一個任務異步生成excel文件,然后文件上傳到對象存儲服務器。前端輪詢任務是否完成,后端返回文件地址給前端下載。文章來源地址http://www.zghlxwxcb.cn/news/detail-430302.html

到了這里,關于SpringBoot實現導出Excel功能的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 接了個變態(tài)需求:生成 Excel + PDF 導出,用 Java 怎么實現?

    接了個變態(tài)需求:生成 Excel + PDF 導出,用 Java 怎么實現?

    Excel、PDF的導出、導入是我們工作中經常遇到的一個問題,剛好今天公司業(yè)務遇到了這個問題,順便記個筆記以防下次遇到相同的問題而束手無策。 公司有這么兩個需求: 需求一 、給了一個表單,讓把查出來的數據組裝到表單中并且提供以PDF格式的下載功能。 需求二、 ?將

    2024年02月20日
    瀏覽(19)
  • 【Go】excelize庫實現excel導入導出封裝(一),自定義導出樣式、隔行背景色、自適應行高、動態(tài)導出指定列、動態(tài)更改表頭

    【Go】excelize庫實現excel導入導出封裝(一),自定義導出樣式、隔行背景色、自適應行高、動態(tài)導出指定列、動態(tài)更改表頭

    最近在學go操作excel,畢竟在web開發(fā)里,操作excel是非常非常常見的。這里我選擇用 excelize 庫來實現操作excel。 為了方便和通用,我們需要把導入導出進行封裝,這樣以后就可以很方便的拿來用,或者進行擴展。 我參考的是這篇文章:【GO】excelize導入導出封裝 這個導入導出封

    2024年02月04日
    瀏覽(25)
  • vue 實現導出 Excel功能

    例如,創(chuàng)建一個文件夾命名為 utils ,再創(chuàng)建一個導出Excel的js文件 exportExcel.js 當渲染的table數據中有操作按鈕或者有一些不需要的字段的話,可以寫一個打印模板,用作導出Excel功能

    2024年02月12日
    瀏覽(24)
  • springboot實現導出excel

    添加maven依賴 編寫要導出的類 去數據庫查詢要導出的數據 調用接口導出數據 實操測試 點擊鏈接會實現導出excel的功能 http://162.14.107.118:8086/PC/exportExcelAddMoney

    2024年02月10日
    瀏覽(13)
  • EasyExcel實現Excel文件導入導出功能

    EasyExcel實現Excel文件導入導出功能

    Java領域解析、生成Excel比較有名的框架有Apache poi、jxl等。但他們都存在一個嚴重的問題就是非常的耗內存。如果你的系統并發(fā)量不大的話可能還行,但是一旦并發(fā)上來后一定會OOM或者JVM頻繁的full gc。 EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單、節(jié)省內存著稱。

    2024年02月02日
    瀏覽(23)
  • SpringBoot實現Excel導入導出

    SpringBoot實現Excel導入導出

    話不多說,直接上代碼 依賴文檔 找到pom文件,如下圖所示 引入需要的依賴 導出寫法: 導入寫法: 已上就是導入導出

    2024年02月09日
    瀏覽(22)
  • springboot項目實現excel導出

    springboot項目實現excel導出

    項目中經常會有列表查詢,然后導出excel的功能,以下是其中一種方法,簡單寫個Demo ,先看項目結構: pom.xml 其他依賴就不提了,主要就只這個依賴org.apache.poi.poi-ooxml 說明: poi是Apache旗下的一個開源項目,由Apache官方維護,poi有兩個不同的jar包,分別是處理excel2003和excel2

    2024年02月08日
    瀏覽(19)
  • 使用vue實現導出Excel功能【純前端】

    使用vue實現導出Excel功能【純前端】

    最近接手一個項目,其中一個需求是將查詢出來table中的數據導出為Excel文件,并下載到本地。 問題來了,這種東西,不是應該后端去實現更好一些嗎?如果放在前端做,要拿到全部數據,然后把這些數據進行解析,再進行一系列的騷操作轉化成Excel文件,假如數據量少還好,

    2024年02月10日
    瀏覽(23)
  • Vue前端實現excel的導入、導出、打印功能

    導入導出依賴: npm install xlsx@0.16.9 npm install xlsx-style@0.8.13 --save 安裝xlsx-style,運行報錯 This relative module was not found: ./cptable in ./node_modules/xlsx-style@0.8.13@xlsx-style/dist/cpexcel.js 解決報錯 在node_modulesxlsx-styledistcpexcel.js 807行 的 var cpt = require(\\\'./cpt\\\' + \\\'able\\\'); 改為: var cpt = cptable; 打印

    2023年04月08日
    瀏覽(24)
  • 【Java】百萬數據excel導出功能如何實現

    【Java】百萬數據excel導出功能如何實現

    人不走空 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? 目錄 ? ????????個人主頁:人不走空?????? ??系列專欄:算法專題 ?詩詞歌賦:斯是陋室,惟吾德馨 前言 1.異步處理 1.1 使用job 1.2 使用mq 2.使用easyexcel 3.分頁查詢 4.多個she

    2024年02月20日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包