======================================================Controller
@ApiOperation("导出结算汇总表")
@Log(module = "结算汇总表管理", func = "导出结算汇总表")
@GetMapping(value = "/export")
@Func(code = "export" ,name = "导出")
public void export(TradeSettlementQTO.settlementList qo, @ApiIgnore HttpServletResponse response) throws Exception {
ExportDataDTO exportData = iTradeSettlementRpc.export(qo);
ExcelUtil.export(exportData, response);
}
=======================================================RPC
@Override
public ExportDataDTO export(TradeSettlementQTO.settlementList qo) throws Exception {
//PageData分页类
//TradeSettlementVO.ListVO返回前端字段
//pageData导出列表
PageData<TradeSettlementVO.ListVO> pageData = pageData(qo);
return ExcelUtil.treatmentBean(pageData.getContent(), TradeSettlementVO.ListVO.class);
}
//列表
@Override
public PageData<TradeSettlementVO.ListVO> pageData(TradeSettlementQTO.settlementList qto){
return iTradeSettlementService.pageData(qto);
}
=====================================================QTO
@Data
@ApiModel("TradeSettlementQTO.settlementList")
@Accessors(chain = true)
public static class settlementList extends BaseQTO {
@ApiModelProperty("账单开始时间")
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime billStartTime;
@ApiModelProperty("账单结算时间")
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime billEndTime;
@ApiModelProperty("商家id")
private String shopId;
@ApiModelProperty("结算状态")
private Integer settlementState;
}
========================================================DTO
package com.xxx.xxx.common.struct;
import com.gs.lshly.common.excel.ExcelHeader;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
*/
@Data
public class ExportDataDTO implements Serializable {
/**
* 下载文件名称
*/
private String fileName;
/**
* 表头
*/
private List<ExcelHeader> headers;
/**
* 数据
*/
private List<Map<String, Object>> rowData;
}
==============================================================ExcelUtil
package com.gs.lshly.common.utils;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ClassLoaderUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import com.gs.lshly.common.annotation.ExportProperty;
import com.gs.lshly.common.enums.EnumMessage;
import com.gs.lshly.common.excel.ExcelHeader;
import com.gs.lshly.common.struct.ExportDataDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.dubbo.common.utils.StringUtils;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
/**
*/
public class ExcelUtil {
public static <T> ExportDataDTO treatmentBean(List<T> content, Class<T> clazz) throws Exception {
List<Map<String, Object>> rowData = new ArrayList<>();
ExportDataDTO dataDTO = new ExportDataDTO();
ApiModel apiModel = AnnotationUtil.getAnnotation(clazz, ApiModel.class);
//导出文件名
dataDTO.setFileName(URLEncoder.encode(apiModel!=null && StringUtils.isNotEmpty(apiModel.value()) ? apiModel.value() : clazz.getSimpleName(),"UTF-8"));
//导出列
dataDTO.setHeaders(getHeader(clazz));
//导出数据行
for (T row : content) {
Map<String, Object> rowMap = new HashMap<>();
for (ExcelHeader header : dataDTO.getHeaders()) {
Object value = BU.getValue(row, header.getProperty());
if (value != null){
//处理枚举
if(StringUtils.isNotEmpty(header.getEnumClassName())) {
value = EnumUtil.getText((Integer) value, (Class<? extends EnumMessage>) ClassLoaderUtil.loadClass(header.getEnumClassName()));
}
//处理LocalDateTime
if (value instanceof LocalDateTime) {
value = LocalDateTimeUtil.format((LocalDateTime)value, "yyyy-MM-dd HH:mm:ss");
}
//处理LocalDate
if (value instanceof LocalDate) {
value = LocalDateTimeUtil.format((LocalDate)value, "yyyy-MM-dd");
}
}
rowMap.put(header.getProperty(), value);
}
rowData.add(rowMap);
}
dataDTO.setRowData(rowData);
return dataDTO;
}
public static void export(ExportDataDTO exportData, HttpServletResponse response) throws IOException {
String path = System.getProperty("java.io.tmpdir") + RandomUtil.randomString(32) + ".xlsx";
File file = new File(path);
BigExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getBigWriter(file);
writeHeader(writer, exportData.getHeaders());
writer.write(exportData.getRowData());
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition","attachment;filename="+ exportData.getFileName() +".xlsx");
ServletOutputStream out = response.getOutputStream();
writer.flush(out, true);
writer.close();
IoUtil.close(out);
file.deleteOnExit();
}
public static void writeHeader(BigExcelWriter writer, List<ExcelHeader> headers) {
for (ExcelHeader header : headers) {
writer.addHeaderAlias(header.getProperty(), header.getTitle());
}
}
private static List<ExcelHeader> getHeader(Class clazz) {
List<ExcelHeader> headers = new ArrayList<>();
for (Field filed : clazz.getDeclaredFields()) {
ExcelHeader header = new ExcelHeader();
ApiModelProperty apiModelProperty = AnnotationUtil.getAnnotation(filed, ApiModelProperty.class);
if (apiModelProperty != null) {
if (apiModelProperty.hidden()) {
continue;
} else {
header.setIdx(apiModelProperty.position()!=0 ? apiModelProperty.position() : 99);
header.setTitle(StringUtils.isNotEmpty(apiModelProperty.value()) ? apiModelProperty.value() : filed.getName());
header.setProperty(filed.getName());
}
}
ExportProperty exportProperty = AnnotationUtil.getAnnotation(filed, ExportProperty.class);
if (exportProperty != null) {
if (exportProperty.hide()) {
continue;
} else {
header.setTitle(StringUtils.isNotEmpty(exportProperty.value()) ? exportProperty.value() : header.getTitle());
header.setIdx(exportProperty.position()!=0 ? exportProperty.position() : header.getIdx());
header.setEnumClassName(StringUtils.isNotEmpty(exportProperty.enumFullName()) ? exportProperty.enumFullName() : null);
}
}
headers.add(header);
}
Collections.sort(headers, (o1, o2) -> o1.getIdx()!=null && o2.getIdx()!=null && o1.getIdx()>o2.getIdx() ? 1 : -1);
return headers;
}
}