跳到主要内容

导出数据二开

导出数据的整体流程分为:

  1. 根据条件筛选数据
  2. 将数据写入Excel文件
  3. 将文件上传至oss

注:不同业务 导出excel 可能包含一个或多个 表单类型 ,列表类型,表单+列表的sheet 如果Excel中包含表单类型sheet 先读取模板输入流 构建excelWriter循环填充表单数据,如果包含列表sheet 在同一个excelWriter下 循环写列表数据

基于以上思路,我们将整个流程进行了封装,二开时只需根据自己的业务实现对应的业务类即可完成导出整个流程

类图

export-image

新建导出数据格式类

例如:

public class OrderExportVO implements Serializable {


private static final long serialVersionUID = 5589398515975578688L;

@ExcelProperty(value = "订单编号",index = 0)
@ContentStyle(dataFormat = 49)
@ColumnWidth(25)
@ApiModelProperty(value = "订单编号")
private String sn;

public String getSn() {
return sn;
}

public void setSn(String sn) {
this.sn = sn;
}

}

注:@ExcelProperty注解中,value值为列名,index值为列位置

​ @ContentStyle为该列数据样式

​ @ColumnWidth为列宽

新建查询条件类

该类需继承com.enation.app.javashop.export.BaseQueryParam.class

注:由于查询条件会被存入任务表记录,查询条件解析工具类将会把属性上的@ApiModelProperty注解的value值作为属性中文意义存入任务表,所以要求该类中每个属性上必须带有@ApiModelProperty注解,并在vlue属性中填入对应中文意义。

创建对应业务导出任务类

该类需继承对应终端导出任务基类,基类如下:

管理端:com.enation.app.javashop.export.task.base.AdminExportTask.class

商家端:com.enation.app.javashop.export.task.base.ShopExportTask.class

买家端:com.enation.app.javashop.export.task.base.BuyerExportTask.class

例如:

public class OrderManagerExportTask extends AdminExportTask {

private OrderQueryManager orderQueryManager;

//构造方法中传入任务id和查询条件类对象
public OrderManagerExportTask(String taskId,OrderQueryParam queryParam) {
super(taskId);
this.queryParam = queryParam;
orderQueryManager = ApplicationContextHolder.getBean(OrderQueryManager.class);
}

//导出Excel的sheet名称
@Override
public String sheetName() {
return "订单列表";
}

//导出数据格式类
@Override
public Class getDataType() {
return OrderExportVO.class;
}

//上传到oss目录位置
@Override
public String scene() {
return "order";
}

//查询业务数据,并返回导出数据格式类分页数据
@Override
protected WebPage dataList() {
WebPage webPage = orderQueryManager.list((OrderQueryParam) getQueryParam());
List<OrderLineVO> list = webPage.getData();
List<OrderExportVO> excelVOList = Lists.newArrayList();
for (OrderLineVO linVO : list) {
OrderExportVO excelVO = new OrderExportVO(linVO);
excelVOList.add(excelVO);
}
webPage.setData(excelVOList);
return webPage;
}
}

组合类型导出任务类(多个sheet):

public class BillManagerExportTask extends AdminExportTask {

private BillManager billManager;

public BillManagerExportTask(String taskId, BillQueryParam param) {
super(taskId);
this.queryParam = param;
billManager = ApplicationContextHolder.getBean(BillManager.class);
}
/**
* 导出表单数据的sheet名称集合
*
* @return
*/
@Override
public String[] sheetName() {
return new String[]{"订单列表", "退款单列表"};
}
/**
* 导出列表数据的sheet名称集合
*
* @return
*/
@Override
protected String[] formSheetName() {
return new String[]{"结算详情"};
}
/**
* 导出数据类型
*
* @return
*/
@Override
public Class getDataType() {
return BillOrderExportVO.class;
}
/**
* 文件上传目录
*
* @return
*/
@Override
public String scene() {
return "bill";
}
/**
* 根据列表名称获取列表数据
*
* @return
*/
@Override
protected WebPage dataList(String name) {
BillExcel billExcel = billManager.exportBill((BillQueryParam) getQueryParam());
if ("订单列表".equals(name)) {
return billExcel.getOrderList();
} else if ("退款单列表".equals(name)) {
return billExcel.getRefundList();
}
return null;
}
/**
* excel模板输入流
*
* @return
*/
@Override
protected InputStream getStream() {
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("bill.xlsx");
return inputStream;
}
/**
* 表单数据的实体
*
* @return
*/
@Override
protected FormSheet getFormSheet(String name) {
if ("结算详情".equals(name)) {
BillQueryParam queryParam = (BillQueryParam) getQueryParam();
Bill bill = billManager.getModel(queryParam.getBillId());
FormSheet formSheet = new FormSheet();
formSheet.setData(new BillExportVO(bill));
return formSheet;
}
return null;
}
}

调用示例

    public TaskResult export(OrderQueryParam param) {
Admin admin = AdminUserContext.getAdmin();
//创建任务
AdminTask task = new AdminTask();
task.setStatus(TaskStatusEnum.processing.name());
task.setTaskName("订单平台导出");
task.setModuleType(ModuleTypeEnum.ManagerOrderExport.name());
task.setTaskResult("导出中");
task.setUserId(admin.getUid());
task.setUsername(admin.getUsername());
task.setOperateType(OperateTypeEnum.EXPORT.name());
String paramStr = ParamUtil.resolve(param).toJSONString();
task.setParam(paramStr);
adminTaskManager.create(task);

TaskResult taskResult = new TaskResult();
taskResult.setStatus(TaskStatusEnum.success);
taskResult.setTaskId(task.getTaskId());
//创建任务执行器
ExportTask exportTask = new OrderManagerExportTask(task.getTaskId(),param);
//执行异步导出任务
taskExecutor.execTask(exportTask);
return taskResult;

}