如題,excel導出帶下拉框的表格
有這麼個需求,人員導入,但用戶是不知道也不方便選擇部門信息的,需要導出excel的時候帶上部門信息,部門信息是個下拉框。
先引入pom,要3.*的版本纔行
<!-- 阿里excel 解析包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
定義一個 SheetWriteHandler 的實現
@Slf4j
public class UserImportFileFilter implements SheetWriteHandler {
/**
* 下拉框值
*/
private Map<Integer,String[]> dropDownMap;
/**
* 多少行有下拉
*/
private final static Integer rowSize = 200;
public UserImportFileFilter(Map<Integer,String[]> dropDownMap) {
this.dropDownMap = dropDownMap;
}
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
Sheet sheet = writeSheetHolder.getSheet();
DataValidationHelper helper = sheet.getDataValidationHelper();
dropDownMap.forEach((celIndex, strings) -> {
// 區間設置
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, rowSize, celIndex, celIndex);
// 下拉內容
DataValidationConstraint constraint = helper.createExplicitListConstraint(strings);
DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
sheet.addValidationData(dataValidation);
});
}
}
增加一個工具類,用於導出的
/**
* 寫出數據到excel
*
* @param list 要寫出的數據
* @param clazz 寫出數據對應的類
* 如果要指定excel的寬高,需要使用 @ColumnWidth(25) @HeadRowHeight(20) @ContentRowHeight(10) 等相關注解
* 多表頭導出則需要使用到 @ExcelProperty({"主標題", "字符串標題"}) 類似這種寫法
* 需要導出excel有背景顏色,則需要使用:
* 頭背景設置成紅色 IndexedColors.RED.getIndex() @HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 10)
* 頭字體設置成20 @HeadFontStyle(fontHeightInPoints = 20)
* 內容的背景設置成綠色 @ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 17)
* 內容字體設置成20 @ContentFontStyle(fontHeightInPoints = 20)
*
* @param fileName 寫出excel的名稱,例如:1.xls ,不填則默認 MongoDB ID生成策略實現.xls ,注意,一定要帶後綴
* @param sheetName sheet的名稱,不填默認sheet1
* @param <T>
* @return 返回的絕對路徑,如:/temps/excel/out/2020/3/文件導出測試.xlsx
*/
public static <T, E extends SheetWriteHandler> String writeSelect(List<T> list, Class<T> clazz, String fileName, String sheetName, E select){
if (CheckTool.checkNull(fileName)){
fileName = IdUtil.objectId() + ".xls";
}
if (CheckTool.checkNull(sheetName)){
sheetName = "sheet1";
}
//返回存儲在本地的絕對路徑
String path = getOutPath(fileName, false);
try {
HorizontalCellStyleStrategy horizontalCellStyleStrategy = styleDefault();
//如果不需要加樣式,直接將 registerWriteHandler 去掉即可。
ExcelWriterBuilder write = EasyExcel.write(path, clazz);
if (select != null){
write.registerWriteHandler(select);
}
write.registerWriteHandler(horizontalCellStyleStrategy).sheet(sheetName).doWrite(list);
} catch (Exception e) {
log.error("excel 生成失敗!", e);
throw new ServiceException("excel生成失敗");
}
return path;
}
此時,就可以自定義要導出的下拉框了
@GetMapping("getImportExcelFile")
public Result getImportExcelFile(){
HashMap<Integer, String[]> dropDownMap = new HashMap<>();
// 指定下拉框
String[] type = {"全部員工類型","在職員工","退休員工"};
// 從0開始
dropDownMap.put(2, type);
UserImportFileFilter userImportFileFilter = new UserImportFileFilter(dropDownMap);
String s = ExcelTool.writeSelect(null, UserImportFile.class, null, null, userImportFileFilter);
System.out.println(s);
return Result.success(s);
}
注意上面的map,從0開始,序號在那個位置就在哪個列加對應的下拉框。
注意,如果你們已經引入了poi相關的jar,很可能出現依賴衝突。
此時排除掉poi的依賴一般可以解決問題
<!-- 阿里excel 解析包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel-version}</version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>com.test.b2c.base</groupId>
</exclusion>
<exclusion>
<artifactId>poi-ooxml</artifactId>
<groupId>com.test.b2c.base</groupId>
</exclusion>
<exclusion>
<artifactId>poi</artifactId>
<groupId>com.test.b2c.base</groupId>
</exclusion>
</exclusions>
</dependency>