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

SpringBoot導(dǎo)出Excel的四種方式

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

? ? ?背景

? ? ? ?近期接到了一個小需求,要將系統(tǒng)中的數(shù)據(jù)導(dǎo)出為Excel,且能將Excel數(shù)據(jù)導(dǎo)入到系統(tǒng)。對于大多數(shù)研發(fā)人員來說,這算是一個最基本的操作了。但是……我居然有點方!

? ? ? ? 好多年沒有實操這種基礎(chǔ)的功能了。我對于excel導(dǎo)入導(dǎo)出的印象還停留在才入行時的工作經(jīng)歷。配模板,建對應(yīng)的實體類,寫輸入輸出流…代碼繁瑣而低效,且不能很好的支持Excel中的格式調(diào)整、行列合并等各種復(fù)雜操作,每次回想起這些,我都會有一種深深的無力感 。然,研發(fā)技術(shù)的更新?lián)Q代堪稱日新月異。這么多年過去了,也該有更優(yōu)雅的方式實現(xiàn)這些功能了吧!我翻了下自己這些年積累下來的屎山代碼,也參考了公司幾位大佬的手段,將現(xiàn)有項目中實現(xiàn)的Excel導(dǎo)入導(dǎo)出方案整理之后,居然發(fā)現(xiàn),一個小小的公司里竟有如此多的臥龍鳳雛,連這種基操都能鼓搗出三種以上的方法來。

? ? ? ?方法一:來自胡大佬的饋贈?

? ? ? ?第一種方法來自于胡大佬的推薦,大佬說這方法也不是他原創(chuàng)的,而是早年他自某個項目中偶然覓得,奉為圭臬,忍不住收藏下來(說白了就是從別的項目里COPY的),該方法通過自研的一套Excel注解,在實體類上添加注解,然后用一套工具類(見源碼中com.leixi.excel.util.excelOne)實現(xiàn)實體類列表的導(dǎo)出。優(yōu)點是不用建模板,調(diào)用簡單,缺點是遷移麻煩。有好幾個配套的文件如注解,工具類等,想要在別的項目中使用,就涉及到文件的拷貝。老實說,不太優(yōu)雅,而且更可惜的是,這些方法里居然沒有封裝導(dǎo)出方法。下面給出實體類創(chuàng)建,方法調(diào)用的代碼,供各位參考(相關(guān)源碼會在文中提供)

//引入依賴
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.12</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.3.0</version>
        </dependency>

//controller方法,不得不說,調(diào)用起來是真的方便
    @PostMapping(value = "/exportData")
    public ResponseEntity<byte[]> exportData(String fileName) {
        List<ExcelOneDto> list = CommonUtil.buildDemoExcel(ExcelOneDto.class);
        Workbook workbook = new DefaultWriteHandler<ExcelOneDto>().write("sheet名稱",list, ExcelOneDto.class);
        return CommonUtil.exportWorkbook(workbook, fileName);
    }

 //實體類
@Data
public class ExcelOneDto {
    @ExcelCell(priority = "A", cellTitle = "編號")
    private Integer code;

    @ExcelCell(priority = "B", cellTitle = "名稱")
    private String name;


    @ExcelCell(priority = "C", cellTitle = "詳情")
    private String desc;

    @ExcelCell(priority = "D", cellTitle = "備注")
    private String remark;
}

這是導(dǎo)出的測試結(jié)果:

springboot 導(dǎo)出excel,spring boot,excel,java

springboot 導(dǎo)出excel,spring boot,excel,java

? ? ?方法二:ExcelImportUtil工具類

? ? ? ? 第二種方法是我從現(xiàn)有項目中找到的,通過使用ExcelImportUtil的importExcel和exportExcel實現(xiàn)數(shù)據(jù)的導(dǎo)入導(dǎo)出。大概是同事抄得不夠高明,初次看到這個方法時,我覺得蠻臃腫的,但是在經(jīng)過遷移和封裝后,代碼量減了不少,用起來還挺方便,而且該方法還支持Excel導(dǎo)出,以及嵌套的實體導(dǎo)出,可以說是十分高明了。該方法的優(yōu)點:不用excel模板,導(dǎo)出導(dǎo)出方便。缺點是封裝的不夠好。研發(fā)人員使用時需要對ExcelImportUtil進(jìn)行一定的加工。下面是我封裝后的代碼:

//maven依賴
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.3.0</version>
        </dependency>

//control類的導(dǎo)入導(dǎo)出

    @PostMapping(value = "/importData")
    public Object importManageData(@RequestPart("file") MultipartFile file) throws Exception {
        return CommonUtil.getExcelDataFromFile(file, ExcelTwoDto.class, 1,2);
    }

    @PostMapping(value = "/exportData")
    public ResponseEntity<byte[]> exportData(@RequestParam("fileName") String fileName){
        List<ExcelTwoDto> list  = CommonUtil.buildDemoExcel(ExcelTwoDto.class);
        List<Map<String, Object>> exportView = CommonUtil.buildExportView("測試Title", "測試Sheet",list);
        Workbook workbook = ExcelExportUtil.exportExcel(exportView, ExcelType.XSSF);
        ExcelStyleUtil.addNotExistCell(workbook, 0, 3);
        return CommonUtil.exportWorkbook(workbook, fileName);
    }
    
//實體類 
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExcelTwoDto {

    @Excel(name = "第一列" ,fixedIndex = 0, orderNum = "0")
    private String codeOne;
    @Excel(name = "第二列" ,fixedIndex = 1, orderNum = "1", width = 50)
    private String codeTwo;
    @ExcelCollection(name = "第三列" , orderNum = "2")
    private List<ExcelChildDto> codeThree;

    @Excel(name = "第四列" ,fixedIndex = 4, orderNum = "4", width = 50)
    private String codeFour;
    @Excel(name = "第五列" ,fixedIndex = 5, orderNum = "5")
    private String codeFive;
    @Excel(name = "第六列A", groupName = "第六列匯總" ,fixedIndex = 6, orderNum = "6")
    private String codeThreeOne;
    @Excel(name = "第六列B", groupName = "第六列匯總" ,fixedIndex = 7, orderNum = "7")
    private String codeThreeTwo;
    @Excel(name = "第六列C", groupName = "第六列匯總" ,fixedIndex = 8, orderNum = "8")
    private String codeThreeThree;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExcelChildDto {
    @Excel(name = "編碼" ,fixedIndex = 0, orderNum = "0")
    private String code;
    @Excel(name = "名稱" ,fixedIndex = 1, orderNum = "1", width = 50)
    private String name;
}

? ? ? ? 導(dǎo)出測試結(jié)果:

springboot 導(dǎo)出excel,spring boot,excel,java

springboot 導(dǎo)出excel,spring boot,excel,java

? ? ? ?方法三:Excel模板導(dǎo)出

? ? ? ?第三種方案是我從之前的屎山代碼中翻出來的,通過excel模板來實現(xiàn)的方法,現(xiàn)在基本已經(jīng)廢棄了,之所以放在這里是為了做一個參照,讓大家看看不同的實現(xiàn)方法的區(qū)別。這種方式通過創(chuàng)建一個Excel模板和對應(yīng)模板的實體類來實現(xiàn)文件導(dǎo)出,優(yōu)點是實體類里不需要加注解了,而且在excel里可以設(shè)計一些style和格式,缺點是配置excelTemplate太麻煩了。配置繁瑣,且過程中如出現(xiàn)參數(shù)名錯誤,符號錯誤等 ,調(diào)試起來很不方便,如果要增減字段,實體類和excel都得調(diào)整。下面給出編寫的代碼:

// controller方法
    @PostMapping(value = "/exportData")
    public ResponseEntity<byte[]> exportData(@RequestParam("fileName") String fileName) {
        TemplateExportParams params = new TemplateExportParams("templates/template.xlsx");
        params.setScanAllsheet(true);
        Map<String, Object> dataMap = new HashMap<>();
        List<ExcelThreeDto> list  = CommonUtil.buildDemoExcel(ExcelThreeDto.class);
        dataMap.put("titleName", "標(biāo)題名稱");
        dataMap.put("desc", "備注名稱");
        dataMap.put("dataList", list);
        Workbook workbook = ExcelExportUtil.exportExcel(params, dataMap);
        ExcelStyleUtil.setAutoHeight(workbook, 0, 4);
        return CommonUtil.exportWorkbook(workbook, fileName);
    }
    
//實體類
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class ExcelThreeDto {
        private Integer code;
        private String name;
        private String desc;
        private String remark;
    }

? ? ? ? Excel模板的配置

springboot 導(dǎo)出excel,spring boot,excel,java

? ? ? ? 導(dǎo)出的結(jié)果:

springboot 導(dǎo)出excel,spring boot,excel,java

? ? ? ? 由于年代久遠(yuǎn),我沒能找到對應(yīng)的模板導(dǎo)入的方法,于是在網(wǎng)上搜索了相關(guān)資料,編寫了一個較通用的文件導(dǎo)入方法:

//maven依賴
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.3.0</version>
        </dependency>

    /**
     * excel 導(dǎo)入
     */
    @PostMapping("/importData")
    public Object upload(@RequestParam(name = "file") MultipartFile file) {
        return CommonUtil.importExcel(file, 3, ExcelThreeDto.class);
    }

    /**
     * 通用的excel導(dǎo)入的方法
     *
     * @param file 導(dǎo)入文件
     * @param startRow 第幾行開始讀數(shù)據(jù)
     * @param clazz 導(dǎo)入后轉(zhuǎn)成的實體類
     * @return
     * @param <T> 
     */
    @SneakyThrows
    public static <T> List<T> importExcel(MultipartFile file, Integer startRow, Class<T> clazz) {
        Workbook wb = new XSSFWorkbook(file.getInputStream());
        //1.2.獲取Sheet
        Sheet sheet = wb.getSheetAt(0);
        List<T> list = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
        for (int rowNum = startRow; rowNum <= sheet.getLastRowNum(); rowNum++) {
            //根據(jù)索引獲取每一個行
            Row row = sheet.getRow(rowNum);
            T obj = clazz.newInstance();
            for (int cellNum = 0; cellNum < row.getLastCellNum() && cellNum< fields.length; cellNum++) {
                Cell cell = row.getCell(cellNum);
                Object value = CommonUtil.getCellValue(cell);
                Field field = fields[cellNum];
                field.setAccessible(true);
                // 注意,這里是為了演示,只分析了Integer和String的寫法,實際上要根據(jù)Field數(shù)據(jù)的枚舉分類處理
                if (field.getType().equals(Integer.class) && value != null) {
                    field.set(obj, new Double(value.toString()).intValue());
                } else {
                    field.set(obj, value);
                }
            }
            list.add(obj);
        }
        return list;
    }

? ? ? ? 導(dǎo)入的結(jié)果還是蠻令人滿意的:

springboot 導(dǎo)出excel,spring boot,excel,java

? ? ?方法四:easyexcel

? ? ? ? 以上這些都是我從以往的項目中見識到的Excel導(dǎo)入導(dǎo)出方法,那么,時下流行的方式是什么樣的呢?網(wǎng)上搜索資料得知,現(xiàn)在使用頻率較高的是用easyexcel實現(xiàn)的。經(jīng)過一番了解,我將easyexcel的實現(xiàn)方式也列出來作為參考。該方法的優(yōu)點是使用方便,功能強大!本文中我只實現(xiàn)了最簡單的導(dǎo)入導(dǎo)出,easyexcel還支持很多如嵌套導(dǎo)入,合并行列等高級操作,相關(guān)實現(xiàn)可以參考大神的博客【精選】Spring Boot 集成 EasyExcel 3.x 優(yōu)雅實現(xiàn)Excel導(dǎo)入導(dǎo)出_easyexcel3-CSDN博客。 以下是我學(xué)習(xí)了他的博客后,整理的最基本的代碼:

//引入maven依賴
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.3</version>
        </dependency>

//controller:
    @PostMapping(value = "/exportData")
    public void exportData(String fileName, HttpServletResponse response) {
        try {
            this.setExcelResponseProp(response, fileName);
            List<ExcelFourDto> list = CommonUtil.buildDemoExcel(ExcelFourDto.class);;
            EasyExcel.write(response.getOutputStream())
                    .head(ExcelFourDto.class)
                    .excelType(ExcelTypeEnum.XLSX)
                    .sheet(fileName)
                    .doWrite(list);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @PostMapping("/importData")
    @SneakyThrows
    public Object importUserExcel(@RequestPart("file") MultipartFile file) {
            List<ExcelFourDto> list = EasyExcel.read(file.getInputStream())
                    .head(ExcelFourDto.class).sheet().doReadSync();
            return list;
    }
    
    /**
     * 設(shè)置響應(yīng)結(jié)果
     *
     * @param response    響應(yīng)結(jié)果對象
     * @param rawFileName 文件名
     * @throws UnsupportedEncodingException 不支持編碼異常
     */
    private void setExcelResponseProp(HttpServletResponse response, String rawFileName) throws UnsupportedEncodingException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode(rawFileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
    } 

// 實體類
@Data
public class ExcelFourDto {
    @ExcelProperty("編號")
    @ColumnWidth(20)
    private Integer code;

    @ExcelProperty("名稱")
    @ColumnWidth(20)
    private String name;

    @ExcelProperty("詳情")
    @ColumnWidth(20)
    private String desc;

    @ExcelProperty("備注")
    @ColumnWidth(20)
    private String remark;
}

? ? ? 以下是測試結(jié)果:

springboot 導(dǎo)出excel,spring boot,excel,java

springboot 導(dǎo)出excel,spring boot,excel,java

? ? ? ? 原以為胡大佬的方法已經(jīng)是別開生面了,但是對比起來,仍然是落伍了很多(希望胡大佬不要看到這篇博客)。時代真是進(jìn)步的飛快,對于程序員來說,這種變遷顯得尤為明顯。它就像一根鞭子,不斷的抽打著碼農(nóng)們,稍有懈怠就會被這洪流所淹沒…

? ? ? ? (文中附上四種方式的源碼,僅用于學(xué)習(xí)和參考!)文章來源地址http://www.zghlxwxcb.cn/news/detail-774857.html

到了這里,關(guān)于SpringBoot導(dǎo)出Excel的四種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • SpringBoot實現(xiàn)導(dǎo)出Excel功能

    SpringBoot實現(xiàn)導(dǎo)出Excel功能

    需求要做一個導(dǎo)出excel的功能 本篇著重闡述后端怎么實現(xiàn),前端實現(xiàn)的部分只會粗略闡述。該實現(xiàn)方案是經(jīng)過生產(chǎn)環(huán)境考驗的,不是那些拿來練手的小demo。本文闡述的方案可以借鑒用來做畢設(shè)或者加到自己玩的項目中去。 再次聲明,本文是 百萬級數(shù)據(jù)量 的企業(yè)級解決方案,

    2024年02月01日
    瀏覽(36)
  • 《springboot中實現(xiàn)excel表格導(dǎo)出》

    簡介 在Spring Boot中,實現(xiàn)Excel表格導(dǎo)出的方式有很多種,以下是幾種常見的方法: 使用Apache POI:Apache POI是一個開源的Java API,用于處理Microsoft Office文檔格式,包括Excel電子表格。在Spring Boot中,可以使用Apache POI創(chuàng)建Excel文檔,并將其寫入HTTP響應(yīng)中,以實現(xiàn)Excel表格的導(dǎo)出。

    2024年02月16日
    瀏覽(20)
  • SpringBoot實現(xiàn)Excel導(dǎo)入導(dǎo)出,簡單好用

    SpringBoot實現(xiàn)Excel導(dǎo)入導(dǎo)出,簡單好用

    POI是Java操作MicroOffice(如對Excel的導(dǎo)入導(dǎo)出)的一個插件。POI的全稱是(Poor Obfuscation Implementation),POI官網(wǎng)地址是 http://poi.achache.org/index.html 。 EasyPoi對POI進(jìn)行了優(yōu)化 ,更加設(shè)計精巧,使用簡單,接口豐富,擴展簡單。EasyPOI的同類產(chǎn)品有Execel4J,Hutools等。EasyPoi官網(wǎng)地址是 h

    2024年02月11日
    瀏覽(26)
  • poi實現(xiàn)Excel文件導(dǎo)出【SpringBoot篇】

    在系統(tǒng)中,數(shù)據(jù)庫的excel文件導(dǎo)出是一項及為基礎(chǔ)的功能。此篇文章將通過實例利用poi實現(xiàn)excel文件導(dǎo)出。 Jakarta POI 是apache的子項目,目標(biāo)是處理ole2對象。它提供了一組操縱Windows文檔的Java API 。目前比較成熟的是HSSF接口,處理MS Excel(97-2002)對象。它不象我們僅僅是用csv生

    2024年02月05日
    瀏覽(27)
  • SpringBoot和Vue實現(xiàn)Excel導(dǎo)入導(dǎo)出

    SpringBoot和Vue實現(xiàn)Excel導(dǎo)入導(dǎo)出

    hutool工具 hutool工具 瀏覽器格式 打開瀏覽器能下載Excel即成功。 3.1 測試: 通過postman測試,send之后返回true測試成功。 在Navicat刷新,可以看到新寫入的數(shù)據(jù)。

    2024年03月17日
    瀏覽(33)
  • springboot中使用EasyExcel實現(xiàn)Excel 導(dǎo)入導(dǎo)出

    springboot中使用EasyExcel實現(xiàn)Excel 導(dǎo)入導(dǎo)出

    EasyExcel 是一款基于 Java 的簡單易用的 Excel 文件操作工具。它提供了豐富的 API,可以方便地讀取、寫入和操作 Excel 文件,支持常見的 Excel 操作,如讀取/寫入單元格數(shù)據(jù)、合并單元格、設(shè)置樣式、處理大數(shù)據(jù)量等。EasyExcel能大大減少占用內(nèi)存的主要原因是在解析Excel時沒有將

    2024年02月12日
    瀏覽(40)
  • SpringBoot 集成 EasyExcel 3.x 實現(xiàn) Excel 導(dǎo)出

    SpringBoot 集成 EasyExcel 3.x 實現(xiàn) Excel 導(dǎo)出

    目錄 ? EasyExcel官方文檔 EasyExcel是什么? EasyExcel注解 ?springboot集成EasyExcel 簡單入門導(dǎo)出 : 實體類 ?自定義轉(zhuǎn)換類 測試一下 復(fù)雜表頭一對多導(dǎo)出 :? ?自定義注解 定義實體類 自定義單元格合并策略 ?測試一下 ? ? EasyExcel官方文檔 EasyExcel官方文檔 - 基于Java的Excel處理工具

    2024年02月13日
    瀏覽(16)
  • SpringBoot整合EasyExcel,Excel導(dǎo)入導(dǎo)出就靠它了

    SpringBoot整合EasyExcel,Excel導(dǎo)入導(dǎo)出就靠它了

    作者主頁 :Designer 小鄭 作者簡介 :3年JAVA全棧開發(fā)經(jīng)驗,專注JAVA技術(shù)、系統(tǒng)定制、遠(yuǎn)程指導(dǎo),致力于企業(yè)數(shù)字化轉(zhuǎn)型,CSDN學(xué)院、藍(lán)橋云課認(rèn)證講師。 主打方向 :Vue、SpringBoot、微信小程序 本文講解了如何在SpringBoot項目中整合EasyExcel,實現(xiàn)Excel快捷導(dǎo)入導(dǎo)出,解析Excel導(dǎo)入導(dǎo)

    2024年02月16日
    瀏覽(23)
  • Springboot Excel 最簡單的 多sheet表 導(dǎo)入導(dǎo)出

    Springboot Excel 最簡單的 多sheet表 導(dǎo)入導(dǎo)出

    上周學(xué)習(xí)群里有人問到,多個sheet的導(dǎo)出導(dǎo)入,我第一反應(yīng)就是easypoi不是自己就有方法了么? 后面一想,可能有些看客還處于是 找工具類,然后調(diào)試 的寫代碼 的 階段,可能還不會去看jar包的一些函數(shù)。 既然如此,那就寫一寫Excel? 多sheet表 導(dǎo)入導(dǎo)出。 之前的一些excel的相

    2024年02月16日
    瀏覽(20)
  • SpringBoot 集成 EasyExcel 3.x 優(yōu)雅實現(xiàn) Excel 導(dǎo)入導(dǎo)出

    EasyExcel 是一個基于 Java 的、快速、簡潔、解決大文件內(nèi)存溢出的 Excel 處理工具。它能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成 Excel 的讀、寫等功能。 EasyExcel文檔地址: https://easyexcel.opensource.alibaba.com/ 引入依賴 簡單導(dǎo)出 以導(dǎo)出用戶信息為例,接下來手把手教

    2024年02月15日
    瀏覽(30)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包