依赖
<!--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…