背景
由于分配的开发任务中,有8个地方需要Excel导出功能,我们来看看公司目前的导出技术,由于隐私原因,有些地方会有打码。
首先需要写一个properties
文件,文件的key对应实体字段名,value就是对应的Excel表格列名称。如下图:
然后获取要导出的数据,再将数据写入到Excel表格中。如下图:
每次导出都要写一个xSSFWorkbookHandler()
方法。
每次开发导出功能都要这么写,我觉得好麻烦。
于是我开始思考,每次都要创建properties
文件,还要写一个xSSFWorkbookHandler()
,太过繁琐。在我看来,只有获取导出的数据是业务开发人员需要关心的。其他操作不需要业务开发人员操心。
我何不把导出做成注解的形式,把创建properties
文件(不一定需要创建文件),和写xSSFWorkbookHandler()
整合进增强方法中。说干就干,经过一系列操作,终于大功告成。下面我们先来看看成果。
成果展示
首先在要导出的方法上添加@ExportExcel(beanClass = Member.class)
注解,beanClass
的值为导出的实体类class,这里为Member.class
。
然后在要导出的实体类里面给要导出的字段加上@ExportFiled
注解。其中number
为Excel中列名的自定义顺序,name
为Excel中的列名。
导出测试
下面是导出的Excel
下面我将介绍我的注解开发过程。
自定义导出注解
编写ExportExcel
注解
/**
* Description: 导出Excel
*
* @author Lvshen
* @version 1.0
* @date: 2020-8-31 15:02
* @since JDK 1.8
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExportExcel {
/**
* 需要导出的实体class
*/
Class<?> beanClass();
}
编写ExportFiled
注解
/**
* Description: 导出字段注解
*
* @author Lvshen
* @version 1.0
* @date: 2020-8-31 15:04
* @since JDK 1.8
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExportFiled {
/**
* 导出字段顺序
*/
String number();
/**
* 导出字段名称
*/
String name();
}
采用Spring AOP进行方法增强
创建切面类
代码语言:javascript复制@Component
@Aspect
@Slf4j
public class ExportAspect {
...
}
定义横切面
代码语言:javascript复制@Pointcut("@annotation(com.lvshen.demo.annotation.export.ExportExcel)")
public void exportPointcut() {
}
给被注解的方法增强功能
代码语言:javascript复制@Around("exportPointcut()")
public void doExport(ProceedingJoinPoint point) throws Throwable {
Object o = point.proceed();
if (o instanceof List) {
List list = (List) o;
MethodSignature signature = (MethodSignature) point.getSignature();
Method method;
method = point.getTarget().getClass().getMethod(signature.getName(), signature.getMethod().getParameterTypes());
ExportExcel annotation = method.getAnnotation(ExportExcel.class);
//1.获取ExportExcel注解上beanClass的值
Class<?> aClass = annotation.beanClass();
Object[] args = point.getArgs();
//2.获取方法第一个参数值
HttpServletResponse response = (HttpServletResponse) args[0];
exportUtils(response, list, aClass);
}
}
这里我们做几件事:
“1.执行被注解的方法,获取返回值,这里我们约定为
List
集合。 2.获取ExportExcel
注解上beanClass
的值。 3.获取方法第一个参数,即HttpServletResponse
。 4.调用exportUtils()
方法生成Excel。 ”
下面我们来看看exportUtils()
方法
由于内容较多,我将代码转成图片了。如果对上述代码中涉及的自定义注解技术和AOP技术不太了解,可以自行上网了解一下,这里不作过多讲解。
如果你对文中的导出功能感兴趣,可以去Github阅读注解导出源代码,地址为:
“https://github.com/lvshen9/demo/tree/lvshen-dev/src/main/java/com/lvshen/demo/annotation/export ”
欢迎下载