EasyExcel导出案例

  1. 自定义转换器
  2. 多次写减少内存缓存的数据
  3. @ExcelProperty order:排序
  4. @ColumnWidth 列宽

PrescriptionOrdersDto

/**
 * @author qb
 * @version 1.0
 * @since 2022/12/20 8:36
 */
@Data
public class PrescriptionOrdersDto {

    /**
     * 订单短id(京东物流取货使用)
     */
    @ExcelProperty(value = "物流取货码", order = 17)
    @ColumnWidth(13)
    private String shortOrderId;

    /**
     * 订单编号
     */
    @ExcelProperty(value = "处方编号", order = 0)
    @ColumnWidth(22)
    private String orderId;

    @ExcelProperty(value = "登记号", order = 0)
    @ColumnWidth(10)
    private String hisPatId;


    /**
     * 取药方式
     */
    @ExcelProperty(value = "取药方式", order = 11, converter = PickupTypeConverter.class)
    @ColumnWidth(11)
    private String pickupType;

    /**
     * 支付类型
     */
    @ExcelProperty(value = "支付方式", order = 10, converter = PaymentSettingConverter.class)
    @ColumnWidth(11)
    private String type;


    /**
     * 审核状态
     */
    @ExcelProperty(value = "处方状态", order = 8, converter = AuditStatusConverter.class)
    @ColumnWidth(11)
    private String auditStatus;


    /**
     * 订单状态
     */
    @ExcelProperty(value = "支付状态", order = 9, converter = OrderStatusConverter.class)
    @ColumnWidth(11)
    private String status;

    /**
     * 开方日期
     */
    @ExcelProperty(value = "开方时间", order = 4)
    @ColumnWidth(16)
    private LocalDateTime prescriptionTime;

    /**
     * 就诊人身份证号
     */
    @ExcelProperty(value = "患者身份证号", order = 6)
    @ColumnWidth(18)
    private String idCard;

    /**
     * 姓名
     */
    @ExcelProperty(value = "患者姓名", order = 5)
    @ColumnWidth(11)
    private String name;

    /**
     * 手机号
     */
    @ExcelProperty(value = "患者手机号", order = 7)
    @ColumnWidth(14)
    private String phone;


    /**
     * 科室名称
     */
    @ExcelProperty(value = "开方科室", order = 2)
    @ColumnWidth(20)
    private String deptName;

    /**
     * 医生姓名
     */
    @ExcelProperty(value = "开方医生", order = 3)
    @ColumnWidth(15)
    private String doctorName;


    /**
     * 收货姓名
     */
    @ExcelProperty(value = "收件人姓名", order = 12)
    @ColumnWidth(14)
    private String receiverName;

    /**
     * 收货手机
     */
    @ExcelProperty(value = "收件人手机号", order = 13)
    @ColumnWidth(17)
    private String receiverPhone;

    /**
     * 快递状态
     */
    @ExcelProperty(value = "物流状态", order = 15, converter = CourierStatusConverter.class)
    @ColumnWidth(12)
    private String courierStatus;

    /**
     * 快递单号
     */
    @ExcelProperty(value = "物流单号", order = 14)
    @ColumnWidth(15)
    private String courierId;



}

PickupTypeConverter

converter 转换器只举一个例子,其他的都差不多一样的写法

public class PickupTypeConverter implements Converter<String> {

    @Override
    public Class<?> supportJavaTypeKey() {
        //对象属性类型(java中数据类型)
        return String.class;
    }

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

    @Override
    public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                    GlobalConfiguration globalConfiguration) throws Exception {
        return Converter.super.convertToJavaData(cellData, contentProperty, globalConfiguration);
    }

    @Override
    public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) throws Exception {

        //return new WriteCellData<>(PickupType.getDescByCode(value));
        return new WriteCellData<>("根据业务最后转换成的值");
    }


}

FileUtils 工具类

public class FileUtils {

    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
        String percentEncodedFileName = percentEncode(realFileName);

        StringBuilder contentDispositionValue = new StringBuilder();
        contentDispositionValue.append("attachment; filename=")
                .append(percentEncodedFileName)
                .append(";")
                .append("filename*=")
                .append("utf-8''")
                .append(percentEncodedFileName);

        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
        response.setHeader("Content-disposition", contentDispositionValue.toString());
        response.setHeader("download-filename", percentEncodedFileName);
    }

    public static String percentEncode(String s) throws UnsupportedEncodingException {
        String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
        return encode.replaceAll("\\+", "%20");
    }

}

具体导出业务实现

	// ConsolePageOrderParam 查询参数替换成自己的查询参数
	@SneakyThrows
    public void export(ConsolePageOrderParam param,HttpServletResponse response) {
        @Cleanup
        ServletOutputStream os  = response.getOutputStream();
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
        response.setCharacterEncoding("utf-8");
        LocalDateTime now = LocalDateTime.now();
        String fileName = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+ ".xlsx";
        FileUtils.setAttachmentResponseHeader(response,  URLEncoder.encode(fileName,"UTF-8"));
        ExcelWriter excelWriter = EasyExcel.write(os, PrescriptionOrdersDto.class).build();
        // 这里注意 如果同一个sheet只要创建一次
        WriteSheet writeSheet = EasyExcel.writerSheet("处方记录1").build();
        // 页码设置为1   每页大小默认每600条写一次
        AtomicInteger defaultPage = new AtomicInteger(1);
        while (true){
            param.setPageSize(600);
            param.setCurrent(defaultPage.get());
            // 分页查询---退换成自己的查询业务
            Page<PrescriptionOrdersDto> page = baseMapper.selectPageList(new Page<>(param.getCurrent(), param.getPageSize())
                    ,getWrapper(param));
            List<PrescriptionOrdersDto> data = page.getRecords();
            excelWriter.write(data, writeSheet);
            if((long) defaultPage.get() * param.getPageSize() >= page.getTotal()){
                page.getRecords().clear();
                data.clear();
                log.info("break 之前 清除list内容");
                break;
            }
            page.getRecords().clear();
            data.clear();
            log.info("清除list内容");
            defaultPage.incrementAndGet();
        }
        excelWriter.finish();
    }

效果图

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel 是一个基于 Java 的简单、省内存的操作 Excel 的开源项目,支持读取、写入各种格式的 Excel 文件,并且具有高效、易用、可扩展等特点。下面是一个 EasyExcel 导入导出案例实现。 1. 导入Excel文件 我们假设要导入一个 Excel 文件,包含姓名、年龄、地址三列数据,其中第一行为表头,从第二行开始是实际数据。 首先,我们需要定义一个实体类,用于保存 Excel 中的每一行数据: ``` public class Person { private String name; private int age; private String address; // 省略getters和setters } ``` 然后,我们可以使用 EasyExcel 提供的 `@ExcelProperty` 注解将 Excel 中的每一列映射到实体类的属性上: ``` public class Person { @ExcelProperty(index = 0) private String name; @ExcelProperty(index = 1) private int age; @ExcelProperty(index = 2) private String address; // 省略getters和setters } ``` 接下来,我们需要定义一个监听器类,用于读取 Excel 文件并将数据转换成实体类: ``` public class PersonListener extends AnalysisEventListener<Person> { private List<Person> dataList = new ArrayList<>(); @Override public void invoke(Person person, AnalysisContext analysisContext) { dataList.add(person); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 数据读取完毕后的操作 } public List<Person> getDataList() { return dataList; } } ``` 最后,我们可以使用 EasyExcel 提供的 `EasyExcel.read()` 方法来读取 Excel 文件: ``` String fileName = "person.xlsx"; InputStream inputStream = new FileInputStream(fileName); PersonListener personListener = new PersonListener(); EasyExcel.read(inputStream, Person.class, personListener).sheet().doRead(); List<Person> dataList = personListener.getDataList(); ``` 2. 导出Excel文件 我们假设要导出一个 Excel 文件,包含姓名、年龄、地址三列数据,其中第一行为表头,从第二行开始是实际数据。 首先,我们需要定义一个列表,保存需要导出的数据: ``` List<Person> dataList = new ArrayList<>(); dataList.add(new Person("张三", 25, "上海")); dataList.add(new Person("李四", 30, "北京")); dataList.add(new Person("王五", 35, "广州")); ``` 然后,我们可以使用 EasyExcel 提供的 `@ExcelProperty` 注解将实体类的属性映射到 Excel 中的每一列: ``` public class Person { @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "年龄", index = 1) private int age; @ExcelProperty(value = "地址", index = 2) private String address; // 省略getters和setters } ``` 接下来,我们需要定义一个写出器,用于将数据写入 Excel 文件: ``` public class PersonWriter { public static void write(String fileName, List<Person> dataList) throws IOException { OutputStream outputStream = new FileOutputStream(fileName); ExcelWriter excelWriter = EasyExcel.write(outputStream, Person.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet().build(); excelWriter.write(dataList, writeSheet); excelWriter.finish(); } } ``` 最后,我们可以调用 `PersonWriter.write()` 方法将数据写入 Excel 文件: ``` String fileName = "person.xlsx"; PersonWriter.write(fileName, dataList); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值