diff --git a/easyexcel-test/README.md b/easyexcel-test/README.md index 299588a0..7692b703 100644 --- a/easyexcel-test/README.md +++ b/easyexcel-test/README.md @@ -1,3 +1,8 @@ # easyexcel-test -测试案例 \ No newline at end of file +测试案例 + +* [写的填充写法(Fill)](src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java) +* [读的常见写法](src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java) +* [web读写案例](src/test/java/com/alibaba/easyexcel/test/demo/web/WebTest.java) +* [写的常见写法](src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java) \ No newline at end of file diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/DataValidationSheetWriteHandler.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/DataValidationSheetWriteHandler.java new file mode 100644 index 00000000..e920dac3 --- /dev/null +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/DataValidationSheetWriteHandler.java @@ -0,0 +1,38 @@ +package com.alibaba.easyexcel.test.demo.write; + +import com.alibaba.excel.write.handler.SheetWriteHandler; +import com.alibaba.excel.write.handler.context.SheetWriteHandlerContext; +import lombok.extern.slf4j.Slf4j; +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.util.CellRangeAddressList; + + +/** + * 自定义拦截器,实现对特定列增加数据验证 + * + * @author Xin Yan + */ +@Slf4j +public class DataValidationSheetWriteHandler implements SheetWriteHandler { + + @Override + public void afterSheetCreate(SheetWriteHandlerContext context) { + log.info("第{}个Sheet写入成功。", context.getWriteSheetHolder().getSheetNo()); + + // 设置验证生效的范围,四个参数分别为:起始行,终止行,起始列,终止列 + CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 10, 1, 1); + DataValidationHelper helper = context.getWriteSheetHolder().getSheet().getDataValidationHelper(); + // 设置验证方式 + DataValidationConstraint constraint = helper.createDateConstraint(DataValidationConstraint.OperatorType.BETWEEN, + "Date(1900, 1, 1)", "Date(2999, 12, 31)", "yyyy-MM-dd"); + + // 创建验证对象 + DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList); + // 错误提示信息 + dataValidation.createErrorBox("提示","请输入正确格式日期[yyyy-MM-dd]"); + dataValidation.setShowErrorBox(true); + context.getWriteSheetHolder().getSheet().addValidationData(dataValidation); + } +} diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java index 0e7cf2db..72bd68da 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java @@ -705,6 +705,40 @@ public class WriteTest { EasyExcel.write(fileName).head(head()).sheet("模板").doWrite(dataList()); } + /** + * 数据验证自定义拦截器 + *
+ * 对日期标题列进行数据验证,如果格式不为yyyy-MM-dd则提示输入错误 + *
+ * 1. 创建excel对应的实体对象 参照{@link DemoData} + *
+ * 2. 注册拦截器 {@link DataValidationSheetWriteHandler} + *
+ * 3. 直接写即可
+ */
+ @Test
+ public void DataValidationHandlerWrite() {
+ String fileName = TestFileUtil.getPath() + "customHandlerWrite" + System.currentTimeMillis() + ".xlsx";
+ // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
+ EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new DataValidationSheetWriteHandler())
+ .sheet("模板").doWrite(new ArrayList<>());
+ }
+
+
+ @Test
+ public void sheetCol(){
+ String fileName = TestFileUtil.getPath() + "customCol" + System.currentTimeMillis() + ".xlsx";
+ try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).includeColumnFieldNames(Arrays.asList("string","date","doubleData")).build()) {
+ // 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
+ WriteSheet writeSheet = EasyExcel.writerSheet("模板").includeColumnFieldNames(Arrays.asList("string","date")).build();
+ excelWriter.write(data(), writeSheet);
+ writeSheet = EasyExcel.writerSheet(1,"模板1").needHead(false).build();
+ // 第二次写如也会创建头,然后在第一次的后面写入数据
+ WriteTable string = EasyExcel.writerTable().needHead(true).includeColumnFieldNames(Arrays.asList("string")).build();
+ excelWriter.write(data(),writeSheet,string);
+ }
+ }
+
private List