记录一次 使用easyexcel设置数据有效性 做个备忘
gitee 下载easyexcel
easyexcel
纯纯的拉取之后代码 只是在自定义拦截器添加几行代码
WriteTest.java
/**
* 下拉,超链接等自定义拦截器(上面几点都不符合但是要对单元格进行操作的参照这个)
* <p>
* demo这里实现2点。1. 对第一行第一列的头超链接到:https://github.com/alibaba/easyexcel 2. 对第一列第一行和第二行的数据新增下拉框,显示 测试1 测试2
* <p>
* 1. 创建excel对应的实体对象 参照{@link DemoData}
* <p>
* 2. 注册拦截器 {@link CustomCellWriteHandler} {@link CustomSheetWriteHandler}
* <p>
* 2. 直接写即可
*/
@Test
public void customHandlerWrite() {
String fileName = TestFileUtil.getPath() + "customHandlerWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new CustomSheetWriteHandler())
.registerWriteHandler(new CustomCellWriteHandler()).sheet("模板").doWrite(data());
}
下面是自定义拦截器
/**
* 自定义拦截器.对第一列第一行和第二行的数据新增下拉框,显示 测试1 测试2
*
* @author Jiaju Zhuang
*/
@Slf4j
public class CustomSheetWriteHandler implements SheetWriteHandler {
@Override
public void afterSheetCreate(SheetWriteHandlerContext context) {
log.info("第{}个Sheet写入成功。", context.getWriteSheetHolder().getSheetNo());
// 区间设置 第一列第一行和第二行的数据。由于第一行是头,所以第一、二行的数据实际上是第二三行
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 10, 2, 2);
DataValidationHelper helper = context.getWriteSheetHolder().getSheet().getDataValidationHelper();
// DataValidationConstraint constraint = helper.createExplicitListConstraint(new String[] {"测试1", "测试2"});
/**
*只在这里做了改动 创建数字约束
helper.createNumericConstraint(p1,p2,p3,p4)
p1:验证类型 ANY(任意类型)、INTEGER、DECIMAL...
p2:符类型(大于、小于、不等于、区间...)
p3:@param expr1日期公式(当第一个字符为'='时)或格式化数字值
p4:@param expr2日期公式(当第一个字符为'='时)或格式化数字值
*/
DataValidationConstraint numericConstraint =
helper.createNumericConstraint(
DataValidationConstraint.ValidationType.DECIMAL,
DataValidationConstraint.OperatorType.BETWEEN,
"1",
"100");
//对单元格数据进行验证
DataValidation dataValidation = helper.createValidation(numericConstraint, cellRangeAddressList);
//创建提示框 这里创建的是错误提示框
dataValidation.createErrorBox("类型有误","请填写1-100之间的数据");
dataValidation.setShowErrorBox(true);
context.getWriteSheetHolder().getSheet().addValidationData(dataValidation);
}
}
效果: