EasyExcel 的使用
一、簡介
EasyExcel是一個基於Java的簡單、省內存的讀寫Excel的開源項目。
ExsyExcel 的使用
- 依賴
<!-- easyexcel 依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
- 創建實體類
@Data
public class Student implements Serializable {
// @ExcelProperty(index = 2) index 設置從第幾行讀取數據默認從第一行 通過index修改
//@DateTimeFormat("yyyy年MM月dd日 HH時mm分ss秒") 時間格式化 想要的指定格式
// @NumberFormat("#.##%") 想要的百分比數子
/**
* converter屬性定義自己的字符串轉換器
*@ExcelProperty(converter = CustomStringConverter.class) 見下方自定義轉換器
*private String string;
*
*/
@ExcelProperty(converter = CustomStringConverter.class)
@ExcelProperty("id")
private Integer id;
@ExcelProperty("name")
private String name;
}
- 讀表
@Test
public void read() {
String fileName = "zzy.xlsx";
// 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet 文件流會自動關閉
// 參數一:讀取的excel文件路徑
// 參數二:讀取sheet的一行,將參數封裝在DemoData實體類中
// 參數三:讀取每一行的時候會執行DemoDataListener監聽器
EasyExcel.read(fileName, Student.class, new DemoDataListener()).sheet().doRead();
}
- 寫表
@Test
public void simpleWrite() {
String fileName = "zzy.xlsx";
// 這里 需要指定寫用哪個class去讀,然后寫到第一個sheet,名字為模板 然后文件流會自動關閉
// 如果這里想使用03 則 傳入excelType參數即可
// 參數一:寫入excel文件路徑
// 參數二:寫入的數據類型是DemoData
// data()方法是寫入的數據,結果是List<DemoData>集合
EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(data());
}
- 文件的上傳和下載
/**
excel文件的下載
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
EasyExcel.write(response.getOutputStream(), Student.class).sheet("zzy").doWrite(data());
}
/**
excel文件的上傳
*/
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), Student.class, new DemoDataListener()).sheet().doRead();
return "success";
}
- 創建監聽器
public class DemoDataListener extends AnalysisEventListener<DemoData> {
List<DemoData> list = new ArrayList<DemoData>();
/**
* 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來
*/
public DemoDataListener() {}
/**
* @param data
* @param context
*/
@Override
public void invoke(DemoData data, AnalysisContext context) {
System.out.println("每一行的數據:{}", JSON.toJSONString(data));
list.add(data);
}
/**
* 數據處理完之后都會來調用
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println(JSON.toJSONString(list));
}
}
- 自定義轉化器
public class CustomStringConverter implements Converter<String> {
@Override
public Class supportJavaTypeKey() {
return String.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 這里讀的時候會調用
*/
@Override
public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return "自定義:" + cellData.getStringValue();
}
/**
* 這里是寫的時候會調用
*/
@Override
public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return new CellData(value);
}
}
- 讀取頭文件
@Test
public void complexHeaderRead() {
String fileName = "zzy.xlsx";
// 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()
// 這里可以設置1,因為頭就是一行。如果多行頭,可以設置其他值。不傳入默認1行
.headRowNumber(1).doRead();
}