连续写了8个Excel导出功能,我决定把导出功能改造成注解的形式

1 篇文章 0 订阅
1 篇文章 0 订阅

背景

由于分配的开发任务中,有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进行方法增强

创建切面类

@Component
@Aspect
@Slf4j
public class ExportAspect {
   ...
}

定义横切面

@Pointcut("@annotation(com.lvshen.demo.annotation.export.ExportExcel)")
public void exportPointcut() {

}

给被注解的方法增强功能

@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

欢迎下载😀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,您可以使用EasyExcel库来导出多个sheet页,并且可以使用@Excel注解来指定导出的数据的字段和表头信息。下面是一个样例代码,用于演示如何使用@Excel注解导出多个sheet页: ```java // 定义一个导出数据的实体类 public class ExportData { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; // 其他属性... } // 导出多个sheet页的方法 public void exportDataToExcel(String filename) { // 创建导出数据 List<ExportData> dataList1 = new ArrayList<>(); dataList1.add(new ExportData("张三", 20)); dataList1.add(new ExportData("李四", 22)); List<ExportData> dataList2 = new ArrayList<>(); dataList2.add(new ExportData("王五", 25)); dataList2.add(new ExportData("赵六", 27)); // 使用 EasyExcel 进行导出 ExcelWriter writer = EasyExcel.write(filename).build(); WriteSheet sheet1 = EasyExcel.writerSheet(0, "Sheet1").head(ExportData.class).build(); WriteSheet sheet2 = EasyExcel.writerSheet(1, "Sheet2").head(ExportData.class).build(); writer.write(dataList1, sheet1); writer.write(dataList2, sheet2); writer.finish(); } ``` 在这个代码中,我们先定义了一个导出数据实体类ExportData,然后使用EasyExcel库进行导出。我们创建了两个sheet页,分别对应两个导出数据列表dataList1和dataList2。使用@ExcelProperty注解来指定每个字段对应的表头信息。最后使用ExcelWriter将数据Excel文件中,使用WriteSheet来指定每个sheet页的名称和表头信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值