导出列表数据

======================================================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;
    }


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值