Java利用EasyExcel實現(xiàn)導出導入功能的示例代碼
前言
最近的項目中模塊需要用到Excel的導入,在同事的建議下選擇了EasyExcel??戳艘幌翬asyExcel的介紹,其是一個基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的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導出導入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot整合Mybatis并完成CRUD操作的實現(xiàn)示例
這篇文章主要介紹了Spring Boot整合Mybatis并完成CRUD操作的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
Java任意長度byte數(shù)組轉換為int數(shù)組的方法
這篇文章主要給大家介紹了關于Java任意長度byte數(shù)組轉換為int數(shù)組的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2020-07-07
mybatis主從表關聯(lián)查詢,返回對象帶有集合屬性解析
這篇文章主要介紹了mybatis主從表關聯(lián)查詢,返回對象帶有集合屬性解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java報錯:Java.io.FileNotFoundException解決方法
這篇文章主要介紹了Java.io.FileNotFoundException的產(chǎn)生原因和解決方法,造成這個報錯的原因可能有文件路徑錯誤、文件被刪除或移動和權限問題,文中將解決的辦法介紹的非常詳細,需要的朋友可以參考下2024-12-12

