目录
这篇是简单使用,等有时间再整理总结,等后续
* GitHub地址:https://github.com/BadGuy-Darren/MyExcelImportTool.git
1. 使用技术:
基于Poi、反射
2. 组成
组成分为自定义注解包、枚举包、异常包,以及主要实现类
3. 简单使用说明
(1)接收Excel数据实体类
@Data
public class ObjectDTO {
// 要求非空
@NotNull(message = "param不能为空!")
private String param;
// 约束日期格式
@ExcelDateFormat(pattern = "yyyy/MM/dd", message = "日期格式不正确!")
private String dateTime;
// 限定值范围
@ValueLimit(limit = {"数值", "文字"}, message = "类型只能选填数值、文字!")
private String type;
// 当type等于“数值”时,对参数进行数值格式限定
@ExcelNumberFormat(when = "type == 数值", format = "#.##", message = "类型为数值时,minValue为非空数字!")
private String minValue;
// format默认为“#.##”
@ExcelNumberFormat(when = "type == 数值", message = "类型为数值时,maxValue为非空数字!")
private String maxValue;
}
注解有相关说明
注解校验借鉴javax的Validation,在参数验证不通过时会抛出IllegalArgumentException,异常message格式如下:
文件工作表n第a行第b列:日期格式不正确
后续根据业务需要可以继续拓展自定义注解。
(2)业务层
public String excelImport(MultipartFile file) throws IOException, IllegalStatementsException {
GetExcelUtil4 getExcelUtil = new GetExcelUtil4();
/*
初始化工具类
参数:文件、要读取的sheet数
*/
getExcelUtil.initialize(file, 2)
// sheet需以“start.”批注标注起始行,默认不使用
.setStartTag("start.")
// sheet需以“end.”做结束行第一个值,默认不使用(默认读取到全空行结束)
.setEndTag("end.");
// 获取第一个sheet的名称
String sheetName = getExcelUtil.getSheetName(1);
/*
1. 以实体类ObjectDTO接收数据
2. 参数分别为:
(1)要读取的sheet下标,以1开始
(2)起始行号,按excel实际行号
(3)起始列数,按excel实际列号,转数字
(4)每行要读取的cell个数
(5)返回数据集类型
3. getHorizontalData方法为获取数据横向分布,纵向拓展的sheet数值
*/
List<ObjectDTO> ObjectList1 = getExcelUtil.getHorizontalData(1, 2, 1, 5, ObjectDTO.class);
System.out.println(ObjectList1.toString());
/*
同上,但:
getVerticalData方法为获取数据纵向分布,横向拓展的sheet数值
且第(4)点应该为“每列要读取的cell个数”
*/
List<ObjectDTO> ObjectList2 = getExcelUtil.getVerticalData(2, 1, 2, 5, ObjectDTO.class);
System.out.println(ObjectList2.toString());
return "success";
}
文件初始化一次后可以进行多次读取。
(3)Excel样式:
实现层就暂时先不展示了。
4.版本迭代
工具前前后后更新过四版。
第一版是使用List<List<Object>>读取数据,读取数据灵活性特别高。但是在读取模板数据的过程中,不支持数据格式约束等防呆,在读取完数据后还需要对数据进行二次遍历处理才能取到理想数据,业务层还需要大篇幅的数据处理代码(格式约束、数据防呆等)。
第二版开始尝试使用List<DTO>读取数据,通过泛型传递实体类型。通过反射,结合多个条件判断分支,根据DTO中字段注解在工具中做相应的数据防呆与格式处理。该版保留List<List<Object>>读取数据的功能。工具类实际应用效果不错,但功能较为单一,还有很多不严谨的编码。
第三版因在实际应用中出现了更为复杂的业务需求(数据模板数据错落分布,横纵格式交错),于是增加了数据多层嵌套功能,并把能想到的所有可能出现的业务场景都考虑了进去。结果犯了过度设计的错误。完成后的第三版繁琐臃肿,类内部方法之间代码耦合特别严重(多层嵌套的后果)可维护性低,且多层嵌套功能大多数普通场景应用不到。
第四版在观察(同事使用该功能的频率)思辨许久之后最终决定移除该功能,从轻重构代码,得到了现在的第四版。第四版移除多层嵌套。移除List<List<Object>>数据读取功能,仅保留实体类数据读取功能。新增支持一次初始化多次取获取数据功能。多层嵌套功能可以通过获取数据次数的累加,加上业务逻辑的辅助,可以一定程度上实现第三版的数据实体类的多层嵌套功能,目前也够用了。其他更新等遇到了相应的特殊场景再做功能补充。切忌过度设计。
后续将持续维护。