欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java利用EasyExcel實現(xiàn)導出導入功能的示例代碼

 更新時間:2022年11月24日 10:28:46   作者:自由了  
EasyExcel是一個基于Java的、快速、簡潔、解決大文件內存溢出的Excel處理工具。本文廢話不多說,直接上手試試,用代碼試試EasyExcel是否真的那么好用

前言

最近的項目中模塊需要用到Excel的導入,在同事的建議下選擇了EasyExcel??戳艘幌翬asyExcel的介紹,其是一個基于Java的、快速、簡潔、解決大文件內存溢出的Excel處理工具。那廢話不多說,直接上手試試,用代碼試試EasyExcel是否真的那么好用。

一.主要實現(xiàn)步驟

1.@ExcelProperty注解

我們需要導入的類的字段需要用到注解@ExcelProperty("列名"),這里特別注意的是一定得跟對應的導入模板里的表頭保持一致,不然導入的時候匹配不上。

//導出導入類使用注解
@ExcelProperty("表頭對應的中文列名")
private String data;

2.導入模板

public void exportTemplate(HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    String fileName="數(shù)據(jù)模板";
    fileName = URLEncoder.encode(fileName, "UTF-8");
    fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1");
    String filePath = new ClassPathResource("docs/other/".concat(fileName).concat(dateFormat.format(new Date())).concat(".xlsx")).getPath();
    //導出模板表頭
    List<String> headers = Arrays.asList("列名");
    List list = new ArrayList();
    PoiUtil.exportTemplateData(filePath,headers,list);
    //獲取文件流返回給客戶端
    DownloadFileUtil.downloadFile(response, request, filePath);
}
//構造模板基礎數(shù)據(jù),比如下拉列表及其校驗規(guī)則
public static void exportTemplateData(String filePath, List<String> headers, List list) {
        //證件類型 下拉
        List<String> certificationTypeAttributeList = new ArrayList<String>();
        certificationTypeAttributeList.add("身份證");
        certificationTypeAttributeList.add("戶口簿");
        certificationTypeAttributeList.add("護照");
        certificationTypeAttributeList.add("其他");
        // 2.創(chuàng)建Excel
        // 1)創(chuàng)建workbook
        HSSFWorkbook hssfWorkBook = new HSSFWorkbook();
        // 2)創(chuàng)建sheet
        HSSFSheet mainSheet = hssfWorkBook.createSheet(MAIN_SHEET);// 主sheet
        // 用于展示
        //2.1 創(chuàng)建表頭,供用戶輸入
        initHeaders(hssfWorkBook, mainSheet, headers);
        //導出數(shù)據(jù)到主sheet
        setMainSheet(mainSheet, list);
        // attribute 下拉框 sheet
        HSSFSheet certificationTypeAttributeSheet= hssfWorkBook.createSheet(CERTIFICATIONTYPE_ATTRIBUTE_STATUS);
 hssfWorkBook.setSheetHidden(hssfWorkBook.getSheetIndex(certificationTypeAttributeSheet), true);// 設置sheet是否隱藏

        // 3.寫入數(shù)據(jù)
    writeData(hssfWorkBook, mapSheet, mapOneList, map);
        //證件類型位
        writeDropDownData(hssfWorkBook, certificationTypeAttributeSheet, certificationTypeAttributeList, CERTIFICATIONTYPE_ATTRIBUTE_STATUS);

        // 4.設置數(shù)據(jù)有效性
        setDataValid(hssfWorkBook, mainSheet,"boundaryMarking");
        FileOutputStream os = null;
        try {
            String exisname = filePath.substring(0, filePath.lastIndexOf("/"));
            File f = new File(exisname);
            if (!f.exists()) {
                f.mkdirs();//創(chuàng)建目錄
            }
            // 創(chuàng)建可寫入的Excel工作簿
            File file = new File(filePath);
            if (!file.exists()) {
                boolean bool = file.createNewFile();
                System.out.println(bool);
            } else {
                file.delete();
                file.createNewFile();
            }
            os = new FileOutputStream(filePath);
            hssfWorkBook.write(os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(os);
        }
    }

2.創(chuàng)建導入模板下載類

用于下載后填充數(shù)據(jù)進行導入操作

public static void downloadFile(HttpServletResponse response, HttpServletRequest request, String filePath) {
    try {
        //獲取文件
        File file = new File(filePath);
        String fileName = file.getName();
        response.reset();
        ServletOutputStream out = response.getOutputStream();
        request.setCharacterEncoding("UTF-8");
        int BUFFER = 1024 * 10;
        byte data[] = new byte[BUFFER];
        BufferedInputStream bis = null;
        //獲取文件輸入流
        InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));
        // 以流的形式下載文件。
        DataInputStream fis = new DataInputStream(inputStream);
        int read;
        bis = new BufferedInputStream(fis, BUFFER);
        response.setContentType("application/OCTET-STREAM");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        while ((read = bis.read(data)) != -1) {
            out.write(data, 0, read);
        }
        fis.close();
        bis.close();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        File file = new File(filePath);
        //刪除臨時文件
        if (file.exists()) {
            file.delete();
        }
    }
}

3.創(chuàng)建導入監(jiān)聽器,監(jiān)聽器負責處理數(shù)據(jù)

比如數(shù)據(jù)的校驗、轉換、業(yè)務邏輯處理、數(shù)據(jù)入庫操作。我感覺用監(jiān)聽器比較麻煩直接使用了另外一種做法,對監(jiān)聽器感興趣的小伙伴可以去看看

//從前端接收傳過來的文件
InputStream inputStream = file.getInputStream();
List<DataModel> list = EasyExcel.read(inputStream).head(DataModel.class).sheet().doReadSync();
//對解析到數(shù)據(jù)進行邏輯操作......

二.值得注意的地方

1.下拉列表及單選框

如果需要導入的列名需要用到大量的下拉列表,單選框,在創(chuàng)建導入模板里就需要提前將其需要填充的數(shù)據(jù)從數(shù)據(jù)庫或者接口里獲取到先進行下拉列表或者單選框的數(shù)據(jù)填充。而且填充的只能是中文,這就涉及到一個問題,在進行導入處理數(shù)據(jù)時還需要將中文的轉換為其對應的編碼入庫,這時就比較麻煩了。

2.級聯(lián)操作

遇到到省市區(qū)三級聯(lián)或者四級聯(lián)時,同樣需要提前進行數(shù)據(jù)填充,還要維護好級聯(lián)關系。另外就是雖然省市區(qū)的變化不會太大,但是出于數(shù)據(jù)的嚴謹性需要定期同步最新的省市區(qū)數(shù)據(jù),廢棄掉在此之前的數(shù)據(jù)模板(模板導出時文件名帶當前日期,用日期進行判斷),如果業(yè)務不需要這么嚴謹這點可以不用考慮。

三.總結

按業(yè)務場景用了一下,感覺挺不錯,比之前一步步的操作方便多了,導出導入都很快,而且都是流操作,不會產(chǎn)生額外的臨時文件。不過也由于Excel本身的一些限制,在一些業(yè)務場景下使用起來就很費勁,比如有大量下拉列表的這種業(yè)務場景就不太適用。對這塊感興趣的小伙伴可以一起交流交流。

到此這篇關于Java利用EasyExcel實現(xiàn)導出導入功能的示例代碼的文章就介紹到這了,更多相關Java EasyExcel導出導入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 利用Java Set 去除重復object的方法

    利用Java Set 去除重復object的方法

    下面小編就為大家?guī)硪黄肑ava Set 去除重復object的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java設計模式之職責鏈模式詳解

    Java設計模式之職責鏈模式詳解

    Java設計模式中有很多種類別,例如單例模式、裝飾模式、觀察者模式等。本文將為大家詳細介紹其中的職責鏈模式,感興趣的可以了解一下
    2021-12-12
  • Java中將Html轉換為PDF的方法和步驟

    Java中將Html轉換為PDF的方法和步驟

    這篇文章主要介紹了Java中如何將Html轉換為PDF的方法,文中有相關的代碼示例和步驟講解,感興趣的同學可以參考閱讀
    2023-06-06
  • eclipse maven maven-archetype-webapp 創(chuàng)建失敗問題解決

    eclipse maven maven-archetype-webapp 創(chuàng)建失敗問題解決

    這篇文章主要介紹了eclipse maven maven-archetype-webapp 創(chuàng)建失敗問題解決的相關資料,需要的朋友可以參考下
    2016-12-12
  • Springboot項目如何兼容老的Spring項目問題

    Springboot項目如何兼容老的Spring項目問題

    這篇文章主要介紹了Springboot項目如何兼容老的Spring項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java連接MYSQL數(shù)據(jù)庫的詳細步驟

    Java連接MYSQL數(shù)據(jù)庫的詳細步驟

    這篇文章主要為大家介紹了Java連接MYSQL數(shù)據(jù)庫的詳細步驟,感興趣的小伙伴們可以參考一下
    2016-05-05
  • springBoot集成redis的key,value序列化的相關問題

    springBoot集成redis的key,value序列化的相關問題

    這篇文章主要介紹了springBoot集成redis的key,value序列化的相關問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • spring中@Configuration和@Bean注解的用法

    spring中@Configuration和@Bean注解的用法

    這篇文章主要介紹了spring中@Configuration和@Bean注解的用法,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內部包含有一個或多個被@Bean注解的方法,需要的朋友可以參考下
    2023-05-05
  • 一文講解如何解決Java中的IllegalArgumentException異常

    一文講解如何解決Java中的IllegalArgumentException異常

    這篇文章主要給大家介紹了關于如何解決Java中IllegalArgumentException異常的相關資料,IllegalArgumentException是Java中的一個標準異常類,通常在方法接收到一個不合法的參數(shù)時拋出,需要的朋友可以參考下
    2024-03-03
  • Java并發(fā) synchronized鎖住的內容解析

    Java并發(fā) synchronized鎖住的內容解析

    這篇文章主要介紹了Java并發(fā) synchronized鎖住的內容解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09

最新評論