前言
項目中用到EasyExcel讀寫Excel,用到了一下功能,這里做個筆記:
- 列寬自適應:自適應寬度
- 隱藏列:隱藏某些列
- 動態列:固定列 + 動態的生成Excel列
- 單元格下拉框選擇數據:設計單元格下拉數據,并且加校驗
- 單元格文本格式:設置文本格式
EasyExcel 版本:3.0.x
EasyExcel官方文檔
核心代碼實現
- 列寬自適應: 注冊一個EasyExcel內置的寬度策略對象即可
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
- 動態列:這里使用的 List 集合
List<List<String>> heads = new ArrayList<>();
List<String> head0 = new ArrayList<>();
// 固定列
head0.add("ID");
heads.add(head0);
List<String> head1 = new ArrayList<>();
head1.add("Name");
heads.add(head1);
// 動態列
for (xxx) {List<String> dnys = new ArrayList<>();dnys.add("Colxx");heads.add(.);
}
List<String> end = new ArrayList<>();
end.add("End");
heads.add(end);// 設置列
EasyExcel.write(out).head(heads)
- 單元格下拉框選擇數據:注冊一個SheetWriteHandler接口實現類 afterSheetCreate 方法,這里使用匿名內部類。
.registerWriteHandler(new SheetWriteHandler() {@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {Sheet sheet = writeSheetHolder.getSheet();DataValidationHelper helper = sheet.getDataValidationHelper();// 設置下拉列表單元格的位置首行 末行 首列 末列CellRangeAddressList rangeList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);// 設置下拉列表的值:strArr 為字符串數組,下拉框的值DataValidationConstraint constraint = helper.createExplicitListConstraint(strArr);// 設置錯誤提示DataValidation validation = helper.createValidation(constraint, rangeList);// 非下拉選項的值不能輸入validation.setErrorStyle(DataValidation.ErrorStyle.STOP);validation.setSuppressDropDownArrow(true);validation.setShowErrorBox(true);validation.createErrorBox("提示", "請選擇/輸入下拉選項中的值");sheet.addValidationData(validation);}}
)
- 單元格隱藏、單元格文本格式:注冊一個CellWriteHandler,覆蓋afterCellDispose方法,這里使用匿名類
.registerWriteHandler(new CellWriteHandler() {@Overridepublic void afterCellDispose(CellWriteHandlerContext context) {// 設置隱藏列context.getWriteSheetHolder().getSheet().setColumnHidden(0, true);for (WriteCellData<?> writeCellData : context.getCellDataList()) {// 設置文本格式DataFormatData dataFormatData = new DataFormatData();dataFormatData.setIndex((short) 49);writeCellData.getOrCreateStyle().setDataFormatData(dataFormatData);}}
})
最后指定sheet名稱,寫入數據即可。
.sheet("導入").doWrite(datas)