Java 程序員須要讀取 Excel 信息到 數據庫 或者把 數據庫 數據導出到 Excel 的需求,應該會想起 Apache POI 的方案。POI在業界公認的消耗內存容易內存溢出,可是這個不是我用 EasyExcel 的主要理由,我以爲主要是 EasyExcel 的使用是在是太簡單了。html
@GetMapping("/excel")
@ApiOperation(value = "導出", notes = "導出")
public void excel(HttpServletResponse response, AttractInvestmentParam attractInvestmentParam) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 保證下載到本地文件名不亂碼的
String fileName = URLEncodez zr.encode("模版", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// List<模型> 的數據體,替換成本身的業務代碼便可
List<ZhAttractInvestmentQueryVO> aiList = zhAttractInvestmentService.attractInvestmentExcel(attractInvestmentParam);
EasyExcel.write(response.getOutputStream(), ZhAttractInvestmentQueryVO.class).sheet("sheet").doWrite(aiList);
}
複製代碼
你須要處理你的導出模型:把你須要導出的數據封裝成實體類,在屬性上面加上 @ExcelProperty("名稱")java
@ExcelProperty(value = "名稱")
private String name;
複製代碼
導出結果:git
若是須要把導出的 Integer 類型的數字轉換成相對應的字符串,以前的選擇是讓全部的字段都是用 String ,而後在數據庫用 if 語句進行判斷,字段少的話還行,若是字段多就會讓你的 SQL 語句變得很不友好。程序員
如今用 EasyExcel 後你能夠在註解上是用自定義轉換器 在官方文檔有簡單的使用。github
@ExcelProperty(value = "投資方式",converter = InvestmentModeConverter.class)
private Integer investmentMode;
複製代碼
converter = InvestmentModeConverter.class
這個就是轉換的核心類,下面是這個類的代碼數據庫
public class InvestmentModeConverter implements Converter<Integer> {
//這個是須要被轉換結果或者匹配內容
private static final String A = "獨資";
private static final String B = "合資";
private static final String C = "獨資或合資";
//這個接口是返回Java中的對象類型
@Override
public Class supportJavaTypeKey() {
return Integer.class;
}
//這個接口是返回到Excel的類型
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/** * convertToJavaData 從方法名就能看出來 轉換成Java數據,把Excel轉換成實體類 * 解析數據就用到的是這個方法 * 要是表格內容是 獨資 到 實體類 後就變成 Integer類型 1;合資 到 實體類 後就變成 Integer類型 2 */
@Override
public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
String stringValue = cellData.getStringValue();
if (A.equals(stringValue)) {
return 1;
} else if (B.equals(stringValue)) {
return 2;
} else {
return 3;
}
}
/** * 這個方法是咱們的主角 convertToExcelData 翻譯過來就是 轉換到 Excel 數據 * 和上面的方法相似,只不過反了下,實體類字段的值是 1 就轉換成 獨資;2 轉換成 獨資 */
@Override
public CellData convertToExcelData(Integer integer, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
CellData cellData;
if (integer == 1) {
cellData = new CellData(A);
} else if (integer == 2) {
cellData = new CellData(B);
} else {
cellData = new CellData(C);
}
return cellData;
}
}
複製代碼
到這裏導出基本就沒上面障礙了,還有同窗須要使用到多表頭,寫入到指定列,寫入模版,填充 Excel ,讀取 Excel 等等之類的操做,在 alibaba-easyexcel.github.io/index.html 這個 alibaba/easyexcel 項目的文檔下都有,超級好用,簡單,固然我這個自定義轉換器文檔沒介紹。app