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及相关注解使用方法!

目录
相关文章
|
Web App开发 开发者
Chrome 插件篇 - 已安装的crx插件源码查看,插件安装位置查看方法
Chrome 插件篇 - 已安装的crx插件源码查看,插件安装位置查看方法
2209 0
Chrome 插件篇 - 已安装的crx插件源码查看,插件安装位置查看方法
|
C++ 存储 安全
C++中`std::function`和`std::bind`的详细解析
C++中`std::function`和`std::bind`的详细解析
789 0
C++中`std::function`和`std::bind`的详细解析
|
分布式计算 并行计算 大数据
NumPy 并行计算与分布式部署
【8月更文第30天】随着数据量的不断增长,传统的单机计算模型已经难以满足对大规模数据集处理的需求。并行和分布式计算成为了处理这些大数据集的关键技术。虽然 NumPy 本身并不直接支持并行计算,但可以通过结合其他库如 Numba 和 Dask 来实现高效的并行和分布式计算。
431 1
|
NoSQL 安全 算法
redis6.0源码分析:字典扩容与渐进式rehash
redis6.0源码分析:字典扩容与渐进式rehash
574 0
|
安全 搜索推荐 网络安全
面试题:什么是 Referer?
面试题:什么是 Referer?
531 0
Java中抽象类和接口的区别,一文弄懂,图文并茂
Java中抽象类和接口的区别,一文弄懂,图文并茂
2391 0
|
机器学习/深度学习 人工智能 TensorFlow
机器学习案例 — 闻声识鸟
TensorFlow是一个开源的机器学习库—对任何人都是开放的。公司、非营利性组织、研究人员和开发人员已经在一些领域使用了TensorFlow。
4148 0