Java利用EasyExcel實(shí)現(xiàn)導(dǎo)出導(dǎo)入功能的示例代碼
前言
最近的項(xiàng)目中模塊需要用到Excel的導(dǎo)入,在同事的建議下選擇了EasyExcel。看了一下EasyExcel的介紹,其是一個(gè)基于Java的、快速、簡(jiǎn)潔、解決大文件內(nèi)存溢出的Excel處理工具。那廢話不多說(shuō),直接上手試試,用代碼試試EasyExcel是否真的那么好用。
一.主要實(shí)現(xiàn)步驟
1.@ExcelProperty注解
我們需要導(dǎo)入的類的字段需要用到注解@ExcelProperty("列名"),這里特別注意的是一定得跟對(duì)應(yīng)的導(dǎo)入模板里的表頭保持一致,不然導(dǎo)入的時(shí)候匹配不上。
//導(dǎo)出導(dǎo)入類使用注解 @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); //獲取文件流返回給客戶端 DownloadFileUtil.downloadFile(response, request, filePath); }
//構(gòu)造模板基礎(chǔ)數(shù)據(jù),比如下拉列表及其校驗(yàn)規(guī)則 public static void exportTemplateData(String filePath, List<String> headers, List list) { //證件類型 下拉 List<String> certificationTypeAttributeList = new ArrayList<String>(); certificationTypeAttributeList.add("身份證"); certificationTypeAttributeList.add("戶口簿"); 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)建表頭,供用戶輸入 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.寫入數(shù)據(jù) writeData(hssfWorkBook, mapSheet, mapOneList, map); //證件類型位 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)建可寫入的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)入模板下載類
用于下載后填充數(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)聽器,監(jiān)聽器負(fù)責(zé)處理數(shù)據(jù)
比如數(shù)據(jù)的校驗(yàn)、轉(zhuǎn)換、業(yè)務(wù)邏輯處理、數(shù)據(jù)入庫(kù)操作。我感覺(jué)用監(jiān)聽器比較麻煩直接使用了另外一種做法,對(duì)監(jiān)聽器感興趣的小伙伴可以去看看
//從前端接收傳過(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)文章希望大家以后多多支持腳本之家!
- java利用easyexcel實(shí)現(xiàn)導(dǎo)入與導(dǎo)出功能
- Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出操作詳解
- Java+EasyExcel實(shí)現(xiàn)文件的導(dǎo)入導(dǎo)出
- Java用POI導(dǎo)入導(dǎo)出Excel實(shí)例分析
- java使用EasyExcel導(dǎo)入導(dǎo)出excel
- Java中Easypoi實(shí)現(xiàn)excel多sheet表導(dǎo)入導(dǎo)出功能
- java實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出
- Java+element實(shí)現(xiàn)excel的導(dǎo)入和導(dǎo)出
相關(guān)文章
eclipse maven maven-archetype-webapp 創(chuàng)建失敗問(wèn)題解決
這篇文章主要介紹了eclipse maven maven-archetype-webapp 創(chuàng)建失敗問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下2016-12-12Springboot項(xiàng)目如何兼容老的Spring項(xiàng)目問(wèn)題
這篇文章主要介紹了Springboot項(xiàng)目如何兼容老的Spring項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Java連接MYSQL數(shù)據(jù)庫(kù)的詳細(xì)步驟
這篇文章主要為大家介紹了Java連接MYSQL數(shù)據(jù)庫(kù)的詳細(xì)步驟,感興趣的小伙伴們可以參考一下2016-05-05springBoot集成redis的key,value序列化的相關(guān)問(wèn)題
這篇文章主要介紹了springBoot集成redis的key,value序列化的相關(guān)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08spring中@Configuration和@Bean注解的用法
這篇文章主要介紹了spring中@Configuration和@Bean注解的用法,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個(gè)或多個(gè)被@Bean注解的方法,需要的朋友可以參考下2023-05-05一文講解如何解決Java中的IllegalArgumentException異常
這篇文章主要給大家介紹了關(guān)于如何解決Java中IllegalArgumentException異常的相關(guān)資料,IllegalArgumentException是Java中的一個(gè)標(biāo)準(zhǔn)異常類,通常在方法接收到一個(gè)不合法的參數(shù)時(shí)拋出,需要的朋友可以參考下2024-03-03Java并發(fā) synchronized鎖住的內(nèi)容解析
這篇文章主要介紹了Java并發(fā) synchronized鎖住的內(nèi)容解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09