【筆記】Spring整合EasyExcel
EasyExcel
EasyExcel 由五部分組成,分別是配置讀取類(EasyExcelHalper)、匯出Excel類(EasyExcelExportUtil)、匯入Excel類(EasyExcelImportUtil)、匯入Excel返回結果類(EasyExcelImportResult)和xml配置檔案。
應用環境:
單執行緒、不牽扯到併發操作。同一時間只有一人做匯入操作,或只有管理員有匯入許可權。(受限於程式中的唯一性校驗)
匯入資料,列不超過26(受限於英文26個字母,不合法資料的定位),數量不大(受限於程式中資料校驗,不合法資料的定位,所謂越詳細就越複雜),支援常用的資料型別。
優點:
可以控制任意欄位的型別、是否可以為空及某個欄位的唯一性,避免重複匯入。
精確返回某一條不合法資料的某個欄位的位置,方便使用者根據提示修改Excel資料。例如:B3
有嚴格的資料校驗,避免匯入的資料不能轉成目標型別(資料庫欄位型別)。
可以凍結標題行。
缺點:
既要不合法資料精確定位,又要資料校驗,導致控制程式邏輯較多,以資料質量換取效能。
避免重複匯入功能要求不能併發操作。
資料量不能超過一個sheet頁,且資料儘量少。
需要準確在xml裡配置標籤、欄位、欄位資料型別、是否可以為空、是否唯一。
快速入門:
- 新增Maven依賴
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId >
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
- xml配置
預設檔名【easyExcel-config.xml】,當然如果你覺得不爽,可以在EasyExcelHalper類中修改。
預設檔案放到src/main/resources根目錄下。
無需spring載入該配置檔案,EasyExcelHalper類自動去預設位置載入easyExcel-config.xml。
可以配置多個sheet頁,在程式中傳參選擇使用哪個資料模板。
xml的基本結構
<excel>
<sheets>
<sheet>
<title>圖書</title>
<freeze>true</freeze>
<columns>
<column>
<name>書名</name>
<type>java.lang.String</type>
<notNull>true</notNull>
<unique>true</unique>
</column>
<!-- column... -->
</columns>
</sheet>
<!-- sheet... -->
</sheets>
</excel>
其中,excel、sheets、sheet、title、columns、column、name、type節點是必有的。
3.jsp
<body>
<a href="book/exportExcel">匯出Excel</a>
<form action="book/importExcel" method="post" enctype="multipart/form-data">
<input type="file" value="匯入Excel" name="bookExcel">
<input type="submit" value="匯入Excel" >
</form>
</body>
4.Controller
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.sep6th.service.BookSrvImpl;
import com.sep6th.util.EasyExcelImportResult;
/**
* The Apache License 2.0
* Copyright (c) 2018 sep6th
*/
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookSrvImpl bookSrv;
/**
* 匯出
*/
@RequestMapping("/exportExcel")
public void exportExcel(HttpServletResponse response) throws Exception {
String fileName = "書籍清單";
bookSrv.exportExcel(response,fileName);
}
/**
* 匯入
* 返回的json格式:
* {"dataCount":3,"errDataCount":0,"importDataCount":3,"xyOfNullList":[],"xyOfTypeNoMatchList":[],"xyOfRepList":[]}
*/
@RequestMapping("/importExcel")
@ResponseBody
public EasyExcelImportResult importExcel(Model model, MultipartFile bookExcel){
return bookSrv.importExcel(bookExcel);
}
}
- Service
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.sep6th.util.EasyExcelExportUtil;
import com.sep6th.util.EasyExcelImportResult;
import com.sep6th.util.EasyExcelImportUtil;
/**
* The Apache License 2.0
* Copyright (c) 2018 sep6th
*/
@Service
public class BookSrvImpl {
/**
* 匯出模板或資料
*/
public void exportExcel(HttpServletResponse response, String fileName) {
Map<Integer,List<Object[]>> map = new HashMap<Integer,List<Object[]>>();
map.put(0, null);
try {
EasyExcelExportUtil.export(fileName, map, response);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 匯入資料
* @param bookExcel
*/
public EasyExcelImportResult importExcel(MultipartFile bookExcel) {
List<List<Object>> dataList = new ArrayList<List<Object>>();
// 模擬資料庫查出的唯一標識列
Set<String> uniqueIdSet = new HashSet<String>();
uniqueIdSet.add("11");
uniqueIdSet.add("22");
uniqueIdSet.add("33");
EasyExcelImportResult result= EasyExcelImportUtil.readExcel(bookExcel, 0, dataList, uniqueIdSet);
if(result.getErrDataCount()==0){
System.out.println("模擬取資料,向資料庫新增資料中...");
for (List<Object> list: dataList){
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
}
result.setImportDataCount((long) dataList.size());
}
return result;
}
}