EasyExcel导出使用记录:

简介: EasyExcel导出

官方地址:https://www.yuque.com/easyexcel/doc/easyexcel


github:https://github.com/alibaba/easyexcel


介绍:EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。64M内存1分钟内读取75M(46W行25列)的Excel


对比POI:POI在数据量的大的情况下很容易内存溢出,而EasyExcel在大数据量的情况下对内存专门做了处理,祥见:关于EasyExcel


具体代码如下(根据具体业务进行修改):


1.Controller:

/*** 导出Excel -easyExcel* @param orderQuery* @return R*/@Inner(value=false)
@ApiOperation(value="导出Excel", notes="导出Excel")
@SysLog("服务统计导出")
@GetMapping("/exportBizOrder")
publicvoidexportBizOrder2(HttpServletResponseresponse, BizOrderQueryorderQuery) throwsIOException {
bizOrderService.exportBizOrder2(response, orderQuery);
}


2.service层具体业务代码:

/*** 导出查询结果-easyExcel** @param response* @param orderQuery*/voidexportBizOrder2(HttpServletResponseresponse, BizOrderQueryorderQuery) throwsIOException;


impl:

/*** easyExcel* @param response* @param orderQuery* @throws IOException*/@OverridepublicvoidexportBizOrder2(HttpServletResponseresponse, BizOrderQueryorderQuery) throwsIOException {
// 查询导出集合方法(Mapper)List<BizOrderViewDTO>orders=selOrder(orderQuery);
if (orders!=null&&orders.size()>0) {
for (BizOrderViewDTOdata : orders) {
// 服务状态if (data.getOrderStatus() !=null) {
StringorderStatus="";
if ("1".equals(data.getOrderStatus())) {
orderStatus="待服务";
               }
if ("2".equals(data.getOrderStatus())) {
orderStatus="服务中";
               }
if ("3".equals(data.getOrderStatus())) {
orderStatus="服务完成";
               }
if ("4".equals(data.getOrderStatus())) {
orderStatus="服务取消";
               }
data.setOrderStatus(orderStatus);
            }
// 是否需要e代驾StringuserEDJ="否";
if ((data.getUserEDJ() !=null&&Integer.parseInt(data.getUserEDJ()) >0) || (data.getCpNumber() !=null&&data.getCpNumber().length() >0)) {
userEDJ="是";
            }
data.setUserEDJ(userEDJ);
         }
try {
// EasyExcel核心代码response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding(StringPool.UTF_8);
Stringname=StrBuilder.create()
//             .append(BizConstants.EXPORT_TEMPLATE_NAME) // 暂时注释,测试环境中文乱码                  .append(DatePattern.PURE_DATETIME_MS_FORMAT.format(newDate()))// 导出的excel文件名                  .append(BizConstants.EXCEL_XLSX).toString();// BizConstants.EXCEL_XLSX = ".xlsx"// 这里URLEncoder.encode可以防止中文乱码StringfileName=URLEncoder.encode(name, "UTF-8");
//response.setHeader("fileName",fileName);
EasyExcel.write(response.getOutputStream(), BizOrderViewDTO.class)
                  .autoCloseStream(Boolean.FALSE)
                  .sheet(BizConstants.EXPORT_BIZORDER_NAME)// excel中sheet名称                  .doWrite(orders);
         } catch (Exceptione) {
// 重置responseresponse.reset();
response.setContentType("application/json");
response.setCharacterEncoding(StringPool.UTF_8);
Map<String, String>map=newHashMap<String, String>(2);
map.put("status", "failure");
map.put("message", "下载文件失败"+e.getMessage());
response.getWriter().println(JSON.toJSONString(map));
         }
      }
   }


3.查询方法selOrder

/*** 条件查询* @param orderQuery* @return*/privateList<BizOrderViewDTO>selOrder(BizOrderQueryorderQuery) {
logger.debug("BizOrderQuery:{}", orderQuery);
QueryWrapper<BizOrder>queryWrapper=newQueryWrapper<>();
if (orderQuery!=null) {
//订单编号StringorderNumber=orderQuery.getOrderNumber();
if (orderNumber!=null&&orderNumber.length() >0) {
queryWrapper.eq("order_number", orderNumber);
      }
//订单状态IntegerorderStatus=orderQuery.getOrderStatus();
if (orderStatus!=null&&orderStatus>0) {
queryWrapper.eq("order_status", orderStatus);
      }
//下单人手机号StringcustomerPhone=orderQuery.getCustomerPhone();
if (customerPhone!=null&&customerPhone.length() >0) {
queryWrapper.eq("order_phone", customerPhone);
      }
//下单人姓名StringcustomerName=orderQuery.getCustomerName();
if (customerName!=null&&customerName.length() >0) {
queryWrapper.like("order_name", customerName);
      }
//商业保单号StringpolicyNo=orderQuery.getPolicyNo();
if (policyNo!=null&&policyNo.length() >0) {
queryWrapper.eq("policy_number", policyNo);
      }
IntegeredjChoice=orderQuery.getEdjChoice();
if (edjChoice!=null) {
if (edjChoice==1) {
queryWrapper.gt("goods_id", 0);
queryWrapper.isNotNull("cp_number");
         }
if (edjChoice==0) {
queryWrapper.and(Wrapper->Wrapper.isNull("goods_id").or().lt("goods_id", 1));
queryWrapper.and(Wrapper->Wrapper.isNull("cp_number").or().eq("cp_number", ""));
         }
      }
IntegerpayType=orderQuery.getPayType();
if (payType!=null&&payType>0) {
queryWrapper.eq("pay_type", payType);
      }
//订单金额检索下限StringorderAmountIndexFrom=orderQuery.getOrderAmountIndexFrom();
if (orderAmountIndexFrom!=null&&orderAmountIndexFrom.length() >0) {
queryWrapper.ge("order_amount", BigDecimal.valueOf(Double.parseDouble(orderAmountIndexFrom)));
      }
//订单金额检索上限StringorderAmountIndexTo=orderQuery.getOrderAmountIndexTo();
if (orderAmountIndexTo!=null&&orderAmountIndexTo.length() >0) {
queryWrapper.le("order_amount", BigDecimal.valueOf(Double.parseDouble(orderAmountIndexTo)));
      }
//实付金额检索下限StringpayAmountIndexFrom=orderQuery.getPayAmountIndexFrom();
if (payAmountIndexFrom!=null&&payAmountIndexFrom.length() >0) {
queryWrapper.ge("pay_amount", BigDecimal.valueOf(Double.parseDouble(payAmountIndexFrom)));
      }
//实付金额检索上限StringpayAmountIndexTo=orderQuery.getPayAmountIndexTo();
if (payAmountIndexTo!=null&&payAmountIndexTo.length() >0) {
queryWrapper.le("pay_amount", BigDecimal.valueOf(Double.parseDouble(payAmountIndexTo)));
      }
//下单时间检索下限StringorderTimeIndexFrom=orderQuery.getOrderTimeIndexFrom();
if (orderTimeIndexFrom!=null&&orderTimeIndexFrom.length() >0) {
queryWrapper.ge("order_time", orderTimeIndexFrom);
      }
//下单时间检索上限StringorderTimeIndexTo=orderQuery.getOrderTimeIndexTo();
if (orderTimeIndexTo!=null&&orderTimeIndexTo.length() >0) {
queryWrapper.le("order_time", orderTimeIndexTo);
      }
StringorderEndTimeIndexFrom=orderQuery.getEndTimeIndexFrom();
if (orderEndTimeIndexFrom!=null&&orderEndTimeIndexFrom.length() >0) {
queryWrapper.ge("end_time", orderEndTimeIndexFrom);
      }
StringorderEndTimeIndexTo=orderQuery.getEndTimeIndexTo();
if (orderEndTimeIndexTo!=null&&orderEndTimeIndexTo.length() >0) {
queryWrapper.le("end_time", orderEndTimeIndexTo);
      }
IntegerevaluateScoreIndexFrom=orderQuery.getEvaluateScoreIndexFrom();
IntegerevaluateScoreIndexTo=orderQuery.getEvaluateScoreIndexTo();
if (evaluateScoreIndexFrom!=null&&evaluateScoreIndexFrom>0) {
queryWrapper.ge("evaluate_score", evaluateScoreIndexFrom);
      }
if (evaluateScoreIndexTo!=null&&evaluateScoreIndexTo>0) {
queryWrapper.le("evaluate_score", evaluateScoreIndexTo);
      }
if (StrUtil.isNotBlank(orderQuery.getDeptIds())) {
queryWrapper.in("o.dept_id", Arrays.asList(orderQuery.getDeptIds().split(",")));
      }
   }
queryWrapper.orderByDesc("id");
List<BizOrderViewDTO>orderData=bizOrderMapper.queryBizOrderForExport2(queryWrapper);
returnOptional.ofNullable(orderData).orElse(newArrayList<BizOrderViewDTO>());
}

4.返回给前端DTO类BizOrderViewDTO


@DatapublicclassBizOrderViewDTO {
/*** 订单编号*/@ColumnWidth(30)
@ExcelProperty(value="订单编号", index=0)
privateStringorderNumber;
/*** 服务状态*/@ColumnWidth(30)
@ExcelProperty(value="服务状态", index=1)
privateStringorderStatus;
/*** 手机号*/@ColumnWidth(30)
@ExcelProperty(value="手机号", index=2)
privateStringorderPhone;
/*** 用户姓名*/@ColumnWidth(30)
@ExcelProperty(value="用户姓名", index=3)
privateStringorderName;
/*** 保单号*/@ColumnWidth(30)
@ExcelProperty(value="保单号", index=4)
privateStringpolicyNumber;
/*** 所属机构*/@ColumnWidth(50)
@ExcelProperty(value="所属机构", index=5)
privateStringdeptName;
/*** 下单时间*/@ColumnWidth(30)
@ExcelProperty(value="下单时间", index=6)
privateStringorderTime;
/*** 结束时间*/@ColumnWidth(30)
@ExcelProperty(value="结束时间", index=7)
privateStringendTime;
/*** 订单金额*/@ColumnWidth(15)
@ExcelProperty(value="订单金额", index=8)
privateStringorderAmount;
/*** 是否使用e代驾*/@ColumnWidth(30)
@ExcelProperty(value="是否使用e代驾", index=9)
privateStringuserEDJ;
/*** 人民币面值*/@ColumnWidth(30)
@ExcelProperty(value="人民币面值", index=10)
privateStringrmbFaceValueObj;
@ExcelIgnoreprivateStringcpNumber;
}


更多API及相关注解使用方法!

目录
相关文章
|
18天前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
123 3
|
7月前
|
easyexcel Java 数据库
怎样用EasyExcel导出更多代码?
在处理大量数据导出时遇到Java OutOfMemoryError(OOM)。最初使用公司内部工具直接查询全量数据写入Excel,导致OOM。改用阿里EasyExcel后,虽偶发OOM,但问题依旧存在。为解决此问题,采用了分页查询并分批次写入Excel的方法,有效避免了OOM。为简化此过程,封装了一个EasyExcelExport抽象类,包含分批次导出和不分批次导出的方法。使用时需实现getData()和convertSourceData2ExportEntity()方法。通过示例展示了如何利用这个工具类进行分批导出,避免了内存溢出,并减少了重复代码。
|
7月前
|
easyexcel Java 关系型数据库
厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
【5月更文挑战第12天】厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
261 1
|
7月前
|
NoSQL easyexcel Java
easyexcel导入导出百万条数据思路分析
easyexcel导入导出百万条数据思路分析
206 0
|
easyexcel
EasyExcel导出复杂表格到邮箱
自定义单元格合并策略、调用示例、工具类Bo、Excel 模板导出工具类、Vo配置、效果图、MailUtils、模板配置
315 0
 EasyExcel导出复杂表格到邮箱
|
存储 Java easyexcel
每日一博 - Excel导入导出的那点事儿
每日一博 - Excel导入导出的那点事儿
80 0
EasyExcel导出某列为空解决方法
EasyExcel导出某列为空解决方法
|
JavaScript Java
实战:第十七章:xlsx文件导入数据入库
实战:第十七章:xlsx文件导入数据入库
215 0
|
运维 小程序 前端开发
基于小程序云开开发(统计学生信息并导出excel)1.0版本
基于小程序云开开发(统计学生信息并导出excel)1.0版本
124 0
基于小程序云开开发(统计学生信息并导出excel)1.0版本