编码技巧——导出工具类

在开发过程中,对于一些B端的业务,使用者是内部的运营管理同事或CP,基本的功能就是一些表单的查询、查看、结果导出、配置、审核等;对于查询和导出功能,经常需要对一些数据导出到Excel文件,或将一个Excel文件的数据读取到数据库;
在java操作Excel可以使用POI组件;本篇给出相关的代码示例,支持多类型的结果集导、输入流转Excel并读取Excel文件;
1. 依赖
org.apache.poipoi${apache.poi.version}org.apache.poipoi-ooxml${apache.poi.ooxml.version}4.0.13.17
2.结构
支持多种数据集导出,包括.xlsx和.csv,因此涉及导出工具工厂、导出工具抽象模板、加在导出实体需导出字段的注解、导出工具实现类;
(1)注解:
import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** @author AA* ExcelUtils工具的相关注解,加在需要导出的DO的属性上; 打了注解,才导出; alias不为"",则设置属性别名;*/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface ExcelExport {/*** 别名*/String alias() default "";/*** 默认表格填充值*/String defaultCeilValue() default "";}
(2)工厂:
/*** @author AA* @description 文件导出工厂类, 当前支持excel即cvs格式导出* @date 2021/3/9*/public class FileExporterFactory {/*** 根据文件类型和导出数据实体类获取导出工具实例*/public static AbstractFileExporter createExporter(String type, Class clazz) {// .cvs格式if (AbstractFileExporter.OFFICE_EXCEL_CSV.equals(type)) {CsvExporter csvExporter = new CsvExporter();csvExporter.init(clazz, type);return csvExporter;}// .xlsx格式if (AbstractFileExporter.OFFICE_EXCEL_XLSX.equals(type)) {ExcelExporter excelExporter = new ExcelExporter();excelExporter.init(clazz, type);return excelExporter;}return null;}}
(3)抽象模板:
package com.AA.common.utils.exporter;import com.AA.common.utils.DateUtil;import lombok.extern.slf4j.Slf4j;import org.apache.commons.collections.CollectionUtils;import org.apache.commons.lang.StringUtils;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.lang.reflect.Field;import java.nio.charset.StandardCharsets;import java.text.SimpleDateFormat;import java.util.*;import java.util.concurrent.atomic.AtomicReference;import java.util.stream.Collectors;import java.util.stream.Stream;/*** @author AA* @description 文件导出模板抽象类* @date 2021/3/9*/@Slf4jpublic abstract class AbstractFileExporter {/*** 文件类型后缀*/public static final String OFFICE_EXCEL_XLSX = ".xlsx";public static final String OFFICE_EXCEL_CSV = ".csv";/*** 表格头缓存,用map实现*/private static HashMap headersMap = new HashMap<>();/*** 导出数据对应的实体类*/Class clazz;/*** 导出文件类型*/String fileType;/*** 初始化导出工具*/abstract void initExporter(Class clazz);/*** 填充数据行,数据可以是不对齐的*/abstract void writeRows(List rows);/*** 根据导出数据对应的实体类,初始化导出工具*/void init(Class clazz, String fileType) {this.clazz = clazz;this.fileType = fileType;initExporter(clazz);}/*** 数据集转化为导出数据对象*/public void appendData(List data) {List rows = convertToList(data);writeRows(rows);}/*** 写输出流*/abstract public void writeStream(OutputStream outputStream);/*** 数据集转换为二维表格数据,属性为列*/private List convertToList(List data) {final AtomicReference