功能 解析excel表格
新接到一个功能 解析一个excel表格。并存储入库。实现很简单。写完过后看着代码面向过程。完全没有复用,扩展一说。我希望能用这个excel解析使用于所有这种类型的excel表格。
设计思路:
使用模板模式将excel表格的解析过程单独抽出来,创建一个独立的类。解析成map,使用Java反射来创建成对应的对象,然后集合存储后返回
实现思路:
在创建的独立类上加上一个泛型用于接收需要去转换的对象实列。创建一个变量去获取泛型的实例类,用于Java反射转换
代码:实现类
/**
* BaseEntity 是公共字典实体类,限定 T 必须为继承
* BaseEntity 有实体类,避免类型传入错误
*/
public class ExcelPoiWordAnalysis<T extends BaseEntity>{
protected Class<?> tClass = currentModelClass(getClass()) ;
/**
* 获取泛型对象
* @param clazz
* @return
*/
protected static Class<?> currentModelClass(Class<?> clazz) {
// 获取超类
Type type = clazz.getGenericSuperclass();
if (!(type instanceof ParameterizedType)){
throw new RuntimeException("超类没有参数化类型");
}
// 获取超累泛型上设置的类
Type trueType = ((ParameterizedType) type).getActualTypeArguments()[0];
if (!(trueType instanceof Class)) {
throw new RuntimeException("没有在超累泛型上设置实际的类");
}
return (Class<?>) trueType;
}
@Override
public List<T> analysis(MultipartFile file) {
解析方法
}
public List<T> taxWorkBook(Workbook workBook){
poi解析方法实现
}
public T transition( Map<String, Object> map) {
// 反射方法
}
逻辑处理类:
/**
* 继承ExcelPoiWordAnalysis 传入要解析的对象
* 就可以得到解析后的对象集合
*/
@Service
public class BydjAnalysisServiceImpl extends ExcelPoiWordAnalysis<Entity> {
@Transactional(rollbackFor = Exception.class)
@Override
public int wordAnalysis(MultipartFile file) {
List<BydjEntity> analysis = analysis(file);
// 添加逻辑处理类
return 1;
}
}
实体类:
/**
*BaseEntity 是统一字段的公共类就不展示了
*/
public class Entity extends BaseEntity {
private static final long serialVersionUID=1L;
}
模板父类ExcelPoiWordAnalysis。实现 解析和对象转换的解耦。ExcelPoiWordAnalysis只需要完成解析的功能和反射的对象转换。具体解析的文档格式和转换的对象实体则根据子类的传入来定义。当不同不是的excel格式和不同对象时。只需要创建新的子类来继承ExcelPoiWordAnalysis就可以完成文档的解析而子类只需要关注数据库逻辑的处理。