最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

1.@ExcelProperty注解

我們需要導(dǎo)入的類(lèi)的字段需要用到注解@ExcelProperty("列名"),這里特別注意的是一定得跟對(duì)應(yīng)的導(dǎo)入模板里的表頭保持一致,不然導(dǎo)入的時(shí)候匹配不上。

//導(dǎo)出導(dǎo)入類(lèi)使用注解
@ExcelProperty("表頭對(duì)應(yīng)的中文列名")
private String data;

2.導(dǎo)入模板

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();
    //導(dǎo)出模板表頭
    List<String> headers = Arrays.asList("列名");
    List list = new ArrayList();
    PoiUtil.exportTemplateData(filePath,headers,list);
    //獲取文件流返回給客戶(hù)端
    DownloadFileUtil.downloadFile(response, request, filePath);
}
//構(gòu)造模板基礎(chǔ)數(shù)據(jù),比如下拉列表及其校驗(yàn)規(guī)則
public static void exportTemplateData(String filePath, List<String> headers, List list) {
        //證件類(lèi)型 下拉
        List<String> certificationTypeAttributeList = new ArrayList<String>();
        certificationTypeAttributeList.add("身份證");
        certificationTypeAttributeList.add("戶(hù)口簿");
        certificationTypeAttributeList.add("護(hù)照");
        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)建表頭,供用戶(hù)輸入
        initHeaders(hssfWorkBook, mainSheet, headers);
        //導(dǎo)出數(shù)據(jù)到主sheet
        setMainSheet(mainSheet, list);
        // attribute 下拉框 sheet
        HSSFSheet certificationTypeAttributeSheet= hssfWorkBook.createSheet(CERTIFICATIONTYPE_ATTRIBUTE_STATUS);
 hssfWorkBook.setSheetHidden(hssfWorkBook.getSheetIndex(certificationTypeAttributeSheet), true);// 設(shè)置sheet是否隱藏

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

        // 4.設(shè)置數(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)建可寫(xiě)入的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)建導(dǎo)入模板下載類(lèi)

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

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);
        //刪除臨時(shí)文件
        if (file.exists()) {
            file.delete();
        }
    }
}

3.創(chuàng)建導(dǎo)入監(jiān)聽(tīng)器,監(jiān)聽(tīng)器負(fù)責(zé)處理數(shù)據(jù)

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

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

二.值得注意的地方

1.下拉列表及單選框

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

2.級(jí)聯(lián)操作

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

三.總結(jié)

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

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

相關(guān)文章

  • 簡(jiǎn)單談?wù)刯ava中匿名內(nèi)部類(lèi)構(gòu)造函數(shù)

    簡(jiǎn)單談?wù)刯ava中匿名內(nèi)部類(lèi)構(gòu)造函數(shù)

    這篇文章主要簡(jiǎn)單給我們介紹了java中匿名內(nèi)部類(lèi)構(gòu)造函數(shù),并附上了簡(jiǎn)單的示例,有需要的小伙伴可以參考下。
    2015-11-11
  • java線程池實(shí)戰(zhàn)應(yīng)用步驟詳解

    java線程池實(shí)戰(zhàn)應(yīng)用步驟詳解

    這篇文章主要介紹了java線程池實(shí)戰(zhàn)應(yīng)用小結(jié),包括線程池的創(chuàng)建方式,本文給大家分享兩種方式,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2025-04-04
  • Java編程異常簡(jiǎn)單代碼示例

    Java編程異常簡(jiǎn)單代碼示例

    這篇文章主要介紹了Java編程異常簡(jiǎn)單代碼示例,還是比較不錯(cuò)的,這里分享個(gè)大家,需要的朋友可以參考下。
    2017-11-11
  • Json字符串轉(zhuǎn)Java對(duì)象和List代碼實(shí)例

    Json字符串轉(zhuǎn)Java對(duì)象和List代碼實(shí)例

    這篇文章主要介紹了Json字符串轉(zhuǎn)Java對(duì)象和List代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring Boot整合Mybatis并完成CRUD操作的實(shí)現(xiàn)示例

    Spring Boot整合Mybatis并完成CRUD操作的實(shí)現(xiàn)示例

    這篇文章主要介紹了Spring Boot整合Mybatis并完成CRUD操作的實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Java任意長(zhǎng)度byte數(shù)組轉(zhuǎn)換為int數(shù)組的方法

    Java任意長(zhǎng)度byte數(shù)組轉(zhuǎn)換為int數(shù)組的方法

    這篇文章主要給大家介紹了關(guān)于Java任意長(zhǎng)度byte數(shù)組轉(zhuǎn)換為int數(shù)組的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • mybatis主從表關(guān)聯(lián)查詢(xún),返回對(duì)象帶有集合屬性解析

    mybatis主從表關(guān)聯(lián)查詢(xún),返回對(duì)象帶有集合屬性解析

    這篇文章主要介紹了mybatis主從表關(guān)聯(lián)查詢(xún),返回對(duì)象帶有集合屬性解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中連接Mongodb進(jìn)行增刪改查的操作詳解

    Java中連接Mongodb進(jìn)行增刪改查的操作詳解

    MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫(xiě),旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,本文給大家介紹了Java中連接Mongodb進(jìn)行操作,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • Java報(bào)錯(cuò):Java.io.FileNotFoundException解決方法

    Java報(bào)錯(cuò):Java.io.FileNotFoundException解決方法

    這篇文章主要介紹了Java.io.FileNotFoundException的產(chǎn)生原因和解決方法,造成這個(gè)報(bào)錯(cuò)的原因可能有文件路徑錯(cuò)誤、文件被刪除或移動(dòng)和權(quán)限問(wèn)題,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • Android開(kāi)發(fā)簡(jiǎn)單計(jì)算器實(shí)現(xiàn)代碼

    Android開(kāi)發(fā)簡(jiǎn)單計(jì)算器實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android開(kāi)發(fā)簡(jiǎn)單計(jì)算器實(shí)現(xiàn),本文放置了完整的Android開(kāi)發(fā)電腦,通過(guò)部署項(xiàng)目可以直接按到效果,希望本篇文章可以對(duì)你有所幫助
    2021-06-06

最新評(píng)論

武乡县| 满洲里市| 思茅市| 梅州市| 酉阳| 张家界市| 石林| 繁峙县| 谷城县| 米易县| 永寿县| 囊谦县| 同德县| 互助| 军事| 曲麻莱县| 得荣县| 岢岚县| 安顺市| 布拖县| 滁州市| 扎兰屯市| 西安市| 翁牛特旗| 咸阳市| 民权县| 策勒县| 航空| 拉萨市| 宁德市| 仙居县| 大厂| 定兴县| 滨州市| 台东市| 宿州市| 久治县| 阳高县| 郴州市| 皮山县| 海阳市|