功能介绍
该模块针对Excel提供导入导出能力。
使用优势
- 业务代码简洁。传统的导入导出需要在业务层面定义大量场景来完成拼接和填充动作,使用该模块提供的注解可在
pojo
完成这些定义,避免业务代码臃肿。 - 校验场景丰富。支持是否为空,字符串长度,字典设置等校验方式。
引用说明
maven配置
<dependency>
<groupId>com.kingengine.kems.sdk</groupId>
<artifactId>kems-sdk-excel</artifactId>
</dependency>
核心注解介绍
@Import
/**
* 导出到Excel中的名字
*/
String name() default "";
/**
* 字典code,当该字段需要通过字典转义,则在该字段的导入注解上加上dictCode赋上对应的字典code指定该字段对应哪个字典
*/
String dictCode() default "";
/**
* 是否可以为空,当该字段为true,字段数据为空时,导入时会抛错
*/
boolean required() default false;
/**
* 对导入的值进行正则匹配,如果不匹配则抛错
*
*/
String regex() default "";
/**
* 字符串长度,超过设置长度,导入时会抛错
*
*/
int length() default 64;
详细说明参阅
com.kingengine.taoism.kems.sdk.excel.annotation.Import
@export
/**
* 导出时在excel中的排序位置
*/
int sort() default Integer.MAX_VALUE;
/**
* 导出到Excel中的名字.
*/
String name() default "";
/**
* 日期格式, 如: yyyy-MM-dd,日期会按照日期格式进行解析
*/
String dateFormat() default "";
/**
* 字典code,当该字段需要通过字典转义,则在该字段的导出注解上加上dictCode赋上对应的字典code指定该字段对应哪个字典,
* 并且该列会根据字典的内容,转换成下拉框的格式
*/
String dictCode() default "";
/**
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
*/
int scale() default -1;
/**
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
*/
int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
/**
* 导出类型(0数字 1字符串)
*/
ColumnType cellType() default ColumnType.STRING;
/**
* 导出时在excel中每个列的高度
*/
double height() default 14;
/**
* 导出时在excel中每个列的宽
*/
double width() default 16;
/**
* 文字后缀,如% 90 变成90%
*/
String suffix() default "";
/**
* 当值为空时,字段的默认值
*/
String defaultValue() default "";
/**
* 提示信息
*/
String prompt() default "";
/**
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
*/
boolean isExport() default true;
/**
* 是否可以为空,当该字段为true,字段数据为空时不允许导入导出
*/
boolean NotNull() default false;
/**
* 是否自动统计数据,在最后追加一行统计数据总和
*/
boolean isStatistics() default false;
详细说明参阅
com.kingengine.kems.sdk.excel.annotation.Export
常用方法介绍
ExcelCore
该类为Excel SDK
对外提供服务核心类,所有操作均通过该类来进行调用。
doExport:提供导出调用。
doImport:提供导入调用。
setDictMap:当导入导出需要对字段进行字典转换时,需要首先调用该方法,将字典数据设置到处理上下文中。
/**
* 导出到输出流
* @param outputStream 输出流
* @param list 实体列表
* @param clazz class 导出实体类的Class类型
* @param sheetName 表头名称
* @param <T> 泛型
* @throws KeSdkException excel异常
*/
public static <T> void doExport(OutputStream outputStream, List<T> list, Class<T> clazz, String sheetName) throws KeSdkException;
/**
* 导入到相应头
* @param response 响应头
* @param list list 实体列表
* @param clazz class 导出实体类的Class类型
* @param sheetName sheet名称
* @param <T> 泛型
* @throws KeSdkException excel异常
*/
public static <T> void doExport(HttpServletResponse response, List<T> list, Class<T> clazz, String sheetName) throws KeSdkException ;
/**
* 通过excel导入数据到list
* @param sheetName sheet名称
* @param is 输入流
* @param clazz class
* @param <T> 泛型
* @return list
* @throws Exception 异常
*/
public static <T> List<ImportDto<T>> doImport(String sheetName, InputStream is, Class<T> clazz) throws KeSdkException;
/**
* 设置字典到线程变量
* @param map 字典map
*/
public static void setDictMap(Map<String, Map<Integer,String >> map)
导入结果ImportDto
介绍
public class ImportDto<T> {
private Integer row;
private ImportResult status;
private String msg;
private T data;
}
参数名 | 参数类型 | 描述 |
---|---|---|
row | Interger | 对应excel中的所在行 |
status | Enum | 所在行导入结果(SUCCESS,FAIL。详见com.kingengine.taoism.kems.sdk.excel.enums.ImportResult ) |
msg | String | 所在行导入失败时,失败原因描述 |
data | 泛型 |
所在行数据设置到pojo 后 |
简单示例
pojo
定义
示例为了方便,导入、导出共用了一个
pojo
。 建议实际使用中,导入、导出分开定义。
public class Student {
@Export(name = "名称", cellType = ColumnType.STRING,prompt = "这是提示")
@Import(name = "名称")
private String name;
@Export(name = "性别", cellType = ColumnType.STRING)
@Import(name = "性别", length = 10)
private String sex;
@Export(name = "民族", cellType = ColumnType.STRING, dictCode = "mz",NotNull = true)
@Import(name = "民族",dictCode = "mz",length = 10)
private Integer mz;
//年龄开启了统计功能
@Export(name = "年龄", cellType = ColumnType.NUMERIC,isStatistics = true)
@Import(name = "年龄")
private Integer age;
}
导出
测试代码
@Test
public void export() throws KeSdkException, IOException {
Map<String, Map<Integer,String>> map = new HashMap<>();
Map<Integer,String> mz = new HashMap<>();
mz.put(1,"汉族");
mz.put(2,"回族");
// 这里的mz 就是民族字段注解上的dictCode
map.put("mz",mz);
//把民族的字典设置到线程变量
ExcelCore.setDictMap(map);
Student student1 = new Student("小明","男",1,20);
Student student2 = new Student("小万","男",2,21);
List<Student> list = new ArrayList<>();
list.add(student1);
list.add(student2);
File file = new File("C:/Users/JZYQ/Desktop/student2.xls");
OutputStream outputStream = new FileOutputStream(file);
//调用导出方法,把列表数据导出到输出流
ExcelCore.export(outputStream,list,Student.class,"学生信息");
outputStream.flush();
}
导出结果
年龄字段开启了统计功能,所以展示了合计数据。
名称 | 性别 | 民族 | 年龄 |
---|---|---|---|
小明 | 男 | 汉族 | 20 |
小万 | 男 | 回族 | 21 |
合计 | 41.00 |
导入
以上面导出的excel作为导入对象进行测试
测试代码
@Test
public void importExcel() throws Exception {
Map<String, Map<Integer,String>> map = new HashMap<>();
Map<Integer,String> mz = new HashMap<>();
mz.put(1,"汉族");
mz.put(2,"回族");
map.put("mz",mz);
ExcelCore.setDictMap(map);
List<Student> list;
File file = new File("C:/Users/JZYQ/Desktop/student2.xls");
InputStream in = new FileInputStream(file);
list =ExcelCore.importExcel("学生信息",in,Student.class);
System.out.println(list.toString());
}
导入结果:
第三行数据为统计结果,数据不规范,因此会有报错。
[ImportVO{row=1, status=SUCCESS, msg='null', data=Student{name='小明', sex='男', mz=1, age=20}},
ImportVO{row=2, status=SUCCESS, msg='null', data=Student{name='小万', sex='男', mz=2, age=21}},
ImportVO{row=3, status=FAIL, msg='字段【民族】错误:字段字典配置错误或输入错误', data=Student{name='合计', sex='null', mz=null, age=null}}]