动态导出
导出Excel基于Poi进行再次封装的,并且导出支持对象的继承方式从父类对象中获取成员属性并进行导出
与EasyExcel对比
EasyExcel导出会将对象全部的成员属性进行导出,继承的时候也不能指定固定的字段进行导出,会直接将全部的成员属性进行导出,无法避免这些问题,并且导出的时候还不能动态的设置名称
我的这个工具类基于注解配置,如果成员属性上面加上注解将可以根据对象内部的成员属性进行选择性导出,支持继承的方式进行导出,如果父类没有加上这个注解将不会导出这个字段
工具类
public static <T> void writeDemo(HttpServletResponse response, Class<? extends T> flag, List<T> dateList) {
//获取对象配置文件配置
ConfigurationFileName configurationFileName = flag.getDeclaredAnnotation(ConfigurationFileName.class);
SXSSFWorkbook sheets = new SXSSFWorkbook();
SXSSFSheet sheet = sheets.createSheet(configurationFileName.sheetname());
//添加表头
SXSSFRow row = sheet.createRow((int) 0);
CellStyle style = sheets.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
List<String> celltitle = new ArrayList<String>();
titleList(flag, celltitle);
if (celltitle.size() > 0) {
for (int i = 0; i < celltitle.size(); i++) {
SXSSFCell cell = row.createCell(i);
cell.setCellValue(celltitle.get(i));
cell.setCellStyle(style);
}
}
for (int i = 0; i < celltitle.size(); i++) {
sheet.trackAllColumnsForAutoSizing();
sheet.autoSizeColumn(i);
sheet.autoSizeColumn(i);
sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 1);
}
try {
if (dateList.size() > 0) {
for (int i = 0; i < dateList.size(); i++) {
//获取数据
T data = dateList.get(i);
SXSSFRow row1 = sheet.createRow((int) i + 1);
int rowsize = 0;
setvalue(data.getClass(), data, row1, rowsize, style);
}
}
for (int i = 0; i < celltitle.size(); i++) {
sheet.trackAllColumnsForAutoSizing();
sheet.autoSizeColumn(i);
sheet.autoSizeColumn(i);
sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 15 / 10);
}
String fileName = URLEncoder.encode(configurationFileName.fileName() + ".xlsx", "UTF-8").replaceAll("\\+", "%20");
response.setContentType("application/vnd.ms-excel; charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName);
OutputStream outputStream = response.getOutputStream();
sheets.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <T> void setvalue(Class classe, T flag, SXSSFRow row1, int rowsize, CellStyle style) {
try {
Field[] dateFields = classe.getDeclaredFields();
if (dateFields.length > 0) {
for (Field dateField : dateFields) {
dateField.setAccessible(true);
if (dateField.getAnnotation(ConfigurationFileName.class) != null) {
row1.createCell(rowsize).setCellValue((dateField.get(flag) != null ? dateField.get(flag).toString() : ""));
row1.getCell(rowsize).setCellStyle(style);
rowsize++;
}
}
setvalue(classe.getSuperclass(), flag, row1, rowsize, style);
}
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
/**
* 获取标题
*
* @param flag 实体类文件
* @param titleList 标题集合
*/
public static void titleList(Class flag, List<String> titleList) {
Field[] fields = flag.getDeclaredFields();
if (fields.length > 0) {
for (Field field : fields) {
field.setAccessible(true);
ConfigurationFileName configuration = field.getAnnotation(ConfigurationFileName.class);
if (configuration != null && !ObjectUtils.isEmpty(configuration.name())) {
titleList.add(configuration.name());
}
}
titleList(flag.getSuperclass(), titleList);
}
}
动态导入
导入Excel基于HuTool工具包的一次性导入功能封装出来的,并且导入时候也可以更加准确地指向到对象成员属性上面,表格有那些字段,对象里面也会有那些字段如果没有也会去父类找,如果没有遇到的话那就是不处理
代码
/**
* 流读取excel文件响应集合
*
* @param file 文件输入流
* @param falg 响应集合泛型
* @param <T> 语法糖
* @return 文件内容集合
*/
public static <T> List<T> ReadAFileExcel(MultipartFile file, Class<? extends T> falg) {
try {
//读取流数据
ExcelReader excelReader = ExcelUtil.getReader(file.getInputStream());
//取出起始位到终点位置数据
List<Map<String, Object>> maps = excelReader.readAll();
//获取当前类全部成员属性和成员方法
//初始化数据集合
List<T> list = new ArrayList<>();
//初始化键值对集合
getMap(falg, maps, list);
return list;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static <T> void getMap(Class<? extends T> falg, List<Map<String, Object>> maps, List<T> list) {
try {
for (Map<String, Object> map : maps) {
T data=falg.newInstance();
mapToData(map, data, data.getClass());
list.add(data);
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static <T> void mapToData(Map<String, Object> map,T data,Class classe){
try {
Field[] dateFields = classe.getDeclaredFields();
if(dateFields.length>0){
for (Field dateField : dateFields) {
dateField.setAccessible(true);
ConfigurationFileName configuration = dateField.getAnnotation(ConfigurationFileName.class);
if (configuration != null && !ObjectUtils.isEmpty(configuration.name())) {
if(map.containsKey(CollUtil.toList(configuration.name()).get(0)) && map.get(CollUtil.toList(configuration.name()).get(0))!=null) {
Class<?> type=dateField.getType();
switch (type.getTypeName()) {
case "java.lang.String":
dateField.set(data, map.get(CollUtil.toList(configuration.name()).get(0)).toString());
break;
case "java.lang.Integer":
case "int": {
Integer value = Integer.valueOf(map.get(CollUtil.toList(configuration.name()).get(0)).toString());
dateField.set(data, value);
break;
}
case "java.lang.Boolean":
case "boolean": {
Boolean value = Boolean.valueOf(map.get(CollUtil.toList(configuration.name()).get(0)).toString());
dateField.set(data, value);
break;
}
case "java.lang.Double":
case "double": {
Double value = Double.valueOf(map.get(CollUtil.toList(configuration.name()).get(0)).toString());
dateField.set(data, value);
break;
}
case "java.lang.Byte":
case "byte": {
Byte value = Byte.valueOf(map.get(CollUtil.toList(configuration.name()).get(0)).toString());
dateField.set(data, value);
break;
}
case "java.lang.Character":
case "char": {
Character value = (char) map.get(CollUtil.toList(configuration.name()).get(0));
dateField.set(data, value);
break;
}
case "java.lang.Float":
case "float": {
Float value = Float.valueOf(map.get(CollUtil.toList(configuration.name()).get(0)).toString());
dateField.set(data, value);
break;
}
case "java.lang.Long":
case "long": {
Long value = Long.valueOf(map.get(CollUtil.toList(configuration.name()).get(0)).toString());
dateField.set(data, value);
break;
}
case "java.lang.Short":
case "short": {
Short value = Short.valueOf(map.get(CollUtil.toList(configuration.name()).get(0)).toString());
dateField.set(data, value);
break;
}
case "java.util.Date":
DateTime parse = DateUtil.parse(map.get(CollUtil.toList(configuration.name()).get(0)).toString());
dateField.set(data, parse);
break;
}
}
}
}
mapToData(map,data,classe.getSuperclass());
}
} catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
需要的话记得给个好排谢谢
重点提醒
业务代码中部分是原来的EasyExcel进行操作的没有使用到自定义注解,因为全面摆脱了EasyExcel但是我的模块中还是使用了大部分的EasyExcel注解所以懒得去换了,自己记得更换为自定义注解,在上面全部的工具类里面,并且这样还能为自己的模块少导入一个包减轻打包的体积
注解
/**
* @author MoLu
*/
@Documented
//作用域
@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigurationFileName {
/**
* 文件名称
* @return value
*/
String fileName() default "";
/**
* 字段名称
* @return name
*/
String name() default "";
/**
* 为此工作簿创建工作表
* @return
*/
String sheetname() default "";
}
版本依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.15</version>
</dependency>
THE END
暂无评论内容