前言
年关在即,还在最后的迭代处理,还分了个其他同事的单,说是导出的Excel模版的2列要修改为下拉选项,过程很曲折,不说,以下其实就是一个笔记而已!
其实之前分享过阿里的EasyExcel设置单元格下拉框,这里是poi原生设置。
一、场景描述
其实就是下载一个Excel文件,作为导入的模版,然后有一行示例,2列是字典值,希望给用户的输入做个示例。
二、使用步骤
1.引入库
主要就是引入poi相关包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
2.工具类
这里分享工具类的部分方法,免得看的眼花缭乱。
ExcelTools
/**
* 导出带下拉框的Excel
*
* @param outStream 输出流
* @param keyValueMap 表头和属性的Map集合,其中Map中Key为Excel列的名称,Value为反射类的属性
* @param list 数据集合
* @param fileType 文件类型
* @param title 表头
* @param dropDownMap 下拉框Map集合,其中Map中Key为Excel列的序号,Value为下拉框的值
* @param <T> 泛型
* @throws Exception 异常
* @auther zhengwen
*/
public static <T> void exportDropDownExcel(OutputStream outStream, Map<String, String> keyValueMap, List<T> list,
String fileType, String title, Map<Integer, List<String>> dropDownMap) throws Exception {
Workbook wb = createWorkbook(fileType);
exportExcel(wb, outStream, keyValueMap, list, fileType, title, dropDownMap);
}
/**
* 根据文件后缀创建对应的 Workbook
* @param fileType 文件后缀:xls,xlsx
* @return Workbook
*/
private static Workbook createWorkbook(String fileType){
return ExcelConstant.XLS.equals(fileType) ? new HSSFWorkbook() : new XSSFWorkbook();
}
/**
* 创建带下拉选项的Workbook
*
* @param wb Workbook
* @param outStream 输出流
* @param keyValueMap 表头和属性的Map集合,其中Map中Key为Excel列的名称,Value为反射类的属性
* @param list 数据集合
* @param fileType 文件类型
* @param title 表头
* @param dropDownMap 下拉框Map集合,其中Map中Key为Excel列的序号,Value为下拉框的值
* @param <T> 泛型
* @throws Exception 异常
* @auther zhengwen
*/
private static <T> void exportExcel(Workbook wb, OutputStream outStream, Map<String, String> keyValueMap, List<T> list, String fileType, String title, Map<Integer, List<String>> dropDownMap) throws Exception {
List<String> keyList = new ArrayList<>(keyValueMap.keySet());
// 存储属性信息
Map<String, String> attMap = new HashMap<>(CommonConstant.MAP_DEFAULT_INITIAL_CAPACITY);
int index = CommonConstant.ZERO;
if (ExcelConstant.XLS.equals(fileType)) {
// 创建HSSFWorkbook对象(excel的文档对象)
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setWrapText(true);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER