easyexcel导出固定下拉选框的模板,项目中遇到的,记录一下。
1.示例
如图,第四列的值是下拉选框,是服务器端根据真实数据动态生成的。
2.实现方案
2.1 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
2.2 实现
2.2.1首先将模板导入到工程resources目录下
2.2.2 Controller层代码
@GetMapping(value = "/exportExcelTemplate")
public void exportExcel(HttpServletResponse response) {
String fileName = "导入xxxx模板.xlsx";
List<String> collect = adsBuildingChildService.getBuildingNameList().stream().map(AdsBuildingChildName::getBuildingChildName).collect(Collectors.toList());
try {
// 响应类型,编码
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
EasyExcelFactory.write(response.getOutputStream())
.withTemplate(this.getClass().getResourceAsStream("/excelTemplate/" + fileName))
// 将下拉选框需要的值通过构造方法传进SpinnerWriteHandler
.registerWriteHandler(new SpinnerWriteHandler(collect))
.sheet()
// 由于导出的是模板,这里不需要填充数据,如果需要填充数据,这里传真实的业务数据即可
.doWrite(Collections.emptyList());
} catch (Exception e) {
e.printStackTrace();
}
}
2.2.3 SpinnerWriteHandler类
这个类是实现固定下拉选框的关键。
import cn.hutool.core.util.ArrayUtil;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SpinnerWriteHandler implements SheetWriteHandler {
private final List<String> buildingNameList;
public SpinnerWriteHandler(List<String> list) {
this.buildingNameList = list;
}
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
String[] strings = ArrayUtil.toArray(buildingNameList, String.class);
Map<Integer, String[]> mapDropDown = new HashMap<>();
// 这里的数值 对应导出列的顺序 从0开始 strings为下拉选框的值
mapDropDown.put(3, strings);
// 获取到当前的sheet
Sheet sheet = writeSheetHolder.getSheet();
/// 开始设置下拉框
DataValidationHelper helper = sheet.getDataValidationHelper();// 设置下拉框
for (Map.Entry<Integer, String[]> entry : mapDropDown.entrySet()) {
// 起始行、终止行、起始列、终止列
CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, entry.getKey(), entry.getKey());
// 设置下拉框数据
DataValidationConstraint constraint = helper.createExplicitListConstraint(entry.getValue());
DataValidation dataValidation = helper.createValidation(constraint, addressList);
// 处理Excel兼容性问题
if (dataValidation instanceof XSSFDataValidation) {
dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true);
} else {
dataValidation.setSuppressDropDownArrow(false);
}
sheet.addValidationData(dataValidation);
}
}
}