阿里easyExcel导出

883 阅读3分钟

依赖

        <!--EasyExcel相关依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.0.5</version>
        </dependency>

控制层


    /**
     * 导出Web端订单列表
     *
     * @param apiRequest
     * @return
     */
    @SneakyThrows(IOException.class)
    @ApiOperationSupport(order = 99)
    @ApiOperation(value = "导出Web端订单列表", notes = "导出Web端订单列表", produces = "application/json")
    @PostMapping(path = "/export")
    public void exportWebOrderList(@RequestBody @Validated RestRequest<BusinessOrderWebOrderListSearchParam> apiRequest, HttpServletResponse response) throws Exception {
        apiRequest.getParam().setPageSize(Integer.MAX_VALUE);
        PageResult<BusinessOrderWebListVO> pageResults = businessOrderTblService.selectWebOrderList(apiRequest.getParam());
        List<BusinessOrderExcelData> data = BeanUtils.map(pageResults.getItemList(), BusinessOrderExcelData.class);
        this.setExcelRespPropAndExport(response, "订单列表", BusinessOrderExcelData.class, data);
    }



    /**
     * 设置excel下载响应头属性
     */
    protected void setExcelRespPropAndExport(HttpServletResponse response, String rawFileName, Class<?> clazz, List<?> list) throws Exception {
        if (CollectionUtil.isEmpty(list)) {
            log.info("本次导出条数:0");
            return;
        }
        log.info("本次导出条数:{}", list.size());
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode(rawFileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream())
                .head(clazz)
                .excelType(ExcelTypeEnum.XLSX)
                .sheet(rawFileName)
                .doWrite(list);
    }


excel bean

/*
 *
 *  * ******************************************************************************
 *  *
 *  *                       Woodare PROPRIETARY INFORMATION
 *  *
 *  *           The information contained herein is proprietary to Woodare
 *  *            and shall not be reproduced or disclosed in whole or in part
 *  *                     or used for any design or manufacture
 *  *               without direct written authorization from FengDa.
 *  *
 *  *             Copyright (c) 2021 by Woodare.  All rights reserved.
 *  *
 *  * ******************************************************************************
 *
 */

package com.woodare.onlinetaxi.order.service.pojo.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.woodare.onlinetaxi.core.enums.order.OrderChannelEnum;
import com.woodare.onlinetaxi.core.enums.order.OrderSourceEnum;
import com.woodare.onlinetaxi.core.enums.order.OrderStatusEnum;
import com.woodare.onlinetaxi.core.enums.vehicle.VehicleTypeEnum;
import com.woodare.onlinetaxi.order.service.common.convert.CommonConverter;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.util.Date;

/**
 * ClassName BusinessOrderExcelData
 *
 * @author wang
 * Date 2022/1/6 10:20
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class BusinessOrderExcelData {

    @ExcelProperty(value = "订单编号")
    @ColumnWidth(20)
    private String orderNo;

    @ExcelProperty(value = "订单来源", converter = CommonConverter.class)
    @ColumnWidth(20)
    private OrderChannelEnum orderChannel;

    @ExcelProperty(value = "打车类型", converter = CommonConverter.class)
    @ColumnWidth(20)
    private OrderSourceEnum orderSource;

    @ExcelProperty(value = "下单时间")
    @ColumnWidth(20)
    @DateTimeFormat("yyyy-MM-dd hh:mm:ss")
    private Date createTime;

    @ExcelProperty(value = "用车时间")
    @ColumnWidth(20)
    @DateTimeFormat("yyyy-MM-dd hh:mm:ss")
    private Date useVehicleTime;

    @ExcelProperty(value = "出发地")
    @ColumnWidth(20)
    @DateTimeFormat("yyyy-MM-dd hh:mm:ss")
    private String startAddress;

    @ExcelProperty(value = "目的地")
    @ColumnWidth(20)
    private String destinationAddress;

    @ExcelProperty(value = "订单类型", converter = CommonConverter.class)
    @ColumnWidth(20)
    private VehicleTypeEnum vehicleType;

    @ExcelProperty(value = "运力公司")
    @ColumnWidth(20)
    private String company;

    @ExcelProperty(value = "乘车人电话")
    @ColumnWidth(20)
    private String passengerPhone;

    @ExcelProperty(value = "司机电话")
    @ColumnWidth(20)
    private String driverPhone;

    @ExcelProperty(value = "车牌")
    @ColumnWidth(20)
    private String assignVehiclePlateNumber;

    @ExcelProperty(value = "订单总金额")
    @ColumnWidth(20)
    private BigDecimal payablePrice;

    @ExcelProperty(value = "实付金额")
    @ColumnWidth(20)
    private BigDecimal paidPrice;

    @ExcelProperty(value = "退款金额")
    @ColumnWidth(20)
    private BigDecimal refundPrice;

    @ExcelProperty(value = "赔付金额")
    @ColumnWidth(20)
    private BigDecimal punishPrice;

    @ExcelProperty(value = "订单状态", converter = CommonConverter.class)
    @ColumnWidth(20)
    private OrderStatusEnum orderStatus;

}

convert 转换器

/*
 *
 *  * ******************************************************************************
 *  *
 *  *                       Woodare PROPRIETARY INFORMATION
 *  *
 *  *           The information contained herein is proprietary to Woodare
 *  *            and shall not be reproduced or disclosed in whole or in part
 *  *                     or used for any design or manufacture
 *  *               without direct written authorization from FengDa.
 *  *
 *  *             Copyright (c) 2021 by Woodare.  All rights reserved.
 *  *
 *  * ******************************************************************************
 *
 */

package com.woodare.onlinetaxi.order.service.common.convert;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ReadConverterContext;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.woodare.onlinetaxi.core.enums.order.CancelTypeEnum;
import com.woodare.onlinetaxi.core.enums.order.OrderChannelEnum;
import com.woodare.onlinetaxi.core.enums.order.OrderSourceEnum;
import com.woodare.onlinetaxi.core.enums.order.OrderStatusEnum;
import com.woodare.onlinetaxi.core.enums.vehicle.VehicleTypeEnum;

/**
 * ClassName CommonConverter
 *
 * @author wang
 * Date 2022/1/6 10:38
 */
public class CommonConverter implements Converter<Object> {

    @Override
    public Class<?> supportJavaTypeKey() {
        //对象属性类型
        return Object.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        //CellData属性类型
        return CellDataTypeEnum.STRING;
    }

    @Override
    public Integer convertToJavaData(ReadConverterContext<?> context) {
        //CellData转对象属性
        return null;
    }

    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<Object> context) {
        //对象属性转CellData
        Object cellValue = context.getValue();
        if (cellValue == null) {
            return new WriteCellData<>("");
        }
        if (cellValue instanceof OrderStatusEnum) {
            return convertOrderStatus((OrderStatusEnum) cellValue);
        } else if (cellValue instanceof OrderChannelEnum) {
            return convertOrderChannel((OrderChannelEnum) cellValue);
        } else if (cellValue instanceof OrderSourceEnum) {
            return convertOrderSource((OrderSourceEnum) cellValue);
        } else if (cellValue instanceof VehicleTypeEnum) {
            return convertVehicleType((VehicleTypeEnum) cellValue);
        } else if (cellValue instanceof CancelTypeEnum) {
            return convertCancelType((CancelTypeEnum) cellValue);
        } else if (cellValue instanceof Boolean) {
            return convertBoolean((Boolean) cellValue);
        } else {
            return new WriteCellData<>("");
        }
    }

    private WriteCellData<?> convertBoolean(Boolean cellValue) {
        if (cellValue) {
            return new WriteCellData<>("是");
        } else {
            return new WriteCellData<>("否");
        }
    }

    private WriteCellData<?> convertCancelType(CancelTypeEnum cellValue) {
        if (CancelTypeEnum.PASSENGER_ADVANCE.equals(cellValue)) {
            return new WriteCellData<>("乘客提前取消");
        } else if (CancelTypeEnum.DRIVER_REFUSE.equals(cellValue)) {
            return new WriteCellData<>("驾驶员拒绝派单");
        } else if (CancelTypeEnum.PLATFORM.equals(cellValue)) {
            return new WriteCellData<>("平台取消");
        } else if (CancelTypeEnum.PASSENGER_BREAK_CONTRACT.equals(cellValue)) {
            return new WriteCellData<>("乘客违约取消");
        } else if (CancelTypeEnum.DRIVER_BREAK_CONTRACT.equals(cellValue)) {
            return new WriteCellData<>("驾驶员违约取消");
        } else {
            return new WriteCellData<>("");
        }
    }

    private WriteCellData<?> convertVehicleType(VehicleTypeEnum cellValue) {
        if (VehicleTypeEnum.TAXI.equals(cellValue)) {
            return new WriteCellData<>("出租车");
        } else if (VehicleTypeEnum.RIDE_HAILING.equals(cellValue)) {
            return new WriteCellData<>("网约车");
        } else if (VehicleTypeEnum.TAILORED_TAXI.equals(cellValue)) {
            return new WriteCellData<>("专车");
        } else {
            return new WriteCellData<>("");
        }
    }

    private WriteCellData<?> convertOrderSource(OrderSourceEnum cellValue) {
        if (OrderSourceEnum.ONLINE.equals(cellValue)) {
            return new WriteCellData<>("网约");
        } else if (OrderSourceEnum.RAISE_HANDS.equals(cellValue)) {
            return new WriteCellData<>("扬招");
        } else {
            return new WriteCellData<>("");
        }
    }

    private WriteCellData<?> convertOrderChannel(OrderChannelEnum cellValue) {
        if (OrderChannelEnum.APP.equals(cellValue)) {
            return new WriteCellData<>("应用程序端");
        } else if (OrderChannelEnum.H5.equals(cellValue)) {
            return new WriteCellData<>("网页端");
        } else if (OrderChannelEnum.SMALL_PROGRAM.equals(cellValue)) {
            return new WriteCellData<>("小程序端");
        } else {
            return new WriteCellData<>("");
        }
    }

    private WriteCellData<?> convertOrderStatus(OrderStatusEnum cellValue) {
        if (OrderStatusEnum.CREATE.equals(cellValue)) {
            return new WriteCellData<>("新建");
        } else if (OrderStatusEnum.WAITING_DISPATCH.equals(cellValue)) {
            return new WriteCellData<>("等待派单");
        } else if (OrderStatusEnum.DISPATCH.equals(cellValue)) {
            return new WriteCellData<>("派单中");
        } else if (OrderStatusEnum.DISPATCH_CANCEL.equals(cellValue)) {
            return new WriteCellData<>("派单取消");
        } else if (OrderStatusEnum.MANUAL_PROCESSING.equals(cellValue)) {
            return new WriteCellData<>("人工处理中");
        } else if (OrderStatusEnum.ORDER_RECEIVED.equals(cellValue)) {
            return new WriteCellData<>("已接单");
        } else if (OrderStatusEnum.GOTO_PICK_UP_POINT.equals(cellValue)) {
            return new WriteCellData<>("前往上车点");
        } else if (OrderStatusEnum.WAITING_PASSENGER.equals(cellValue)) {
            return new WriteCellData<>("等待乘客");
        } else if (OrderStatusEnum.CANCEL.equals(cellValue)) {
            return new WriteCellData<>("取消");
        } else if (OrderStatusEnum.IN_THE_ITINERARY.equals(cellValue)) {
            return new WriteCellData<>("行程中");
        } else if (OrderStatusEnum.COMPLETE.equals(cellValue)) {
            return new WriteCellData<>("已完成");
        } else if (OrderStatusEnum.ERROR_END.equals(cellValue)) {
            return new WriteCellData<>("异常结束");
        } else if (OrderStatusEnum.RESERVATION_FAIL.equals(cellValue)) {
            return new WriteCellData<>("叫车失败");
        } else {
            return new WriteCellData<>("");
        }
    }


}

服务器环境导出问题

本地正常导出,到了服务器导出 报空指针异常

Caused by: java.lang.NullPointerException: null
    at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1288)
    at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
    at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
    at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:765)
    at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:440)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:385)
    at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
    at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)

在这里插入图片描述 报错信息为 字体为空的问题

环境

docker、openjdk:8-jdk-alpine

docker配置改动

FROM openjdk:8-jdk-alpine
VOLUME /tmp
VOLUME /var/log/online-taxi
ADD target/order-service.jar order-service.jar
EXPOSE 9050
ENV TZ Asia/Shanghai
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
#此处新增了 ttf-dejavu fontconfig
RUN apk add tzdata ttf-dejavu fontconfig \
    && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && apk del tzdata
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/order-service.jar"]

参考链接 blog.51cto.com/u_14774726/… github.com/alibaba/eas… stackoverflow.com/questions/5…