EasyExcel动态头导出

这篇具有很好参考价值的文章主要介绍了EasyExcel动态头导出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

这段时间的项目中需要导出动态表格。
根据所选的参数导出对应的字段内容
EasyExcel动态头导出

下图所示选择下面几个tab页就需要导出对应的表头字段
EasyExcel动态头导出

下面为具体实现的效果。表头样式可以通过EasyExcel 提供的方法自定义。
EasyExcel动态头导出


具体实现

主要是通过 传入 exportItem 这个条件来决定导出的事项。

下附实现代码


public boolean export(QueryBO queryBo) throws CustomException {
    List<Integer> exportItem = queryBo.getExportItem();
    List<BankAccountOverviewVO> bankAccountOverviewList =
        accountOverviewList(queryBo, new PageInfoVo());
    // 动态创建表头
    List<List<String>> headList = new ArrayList<>();
    // 组装数据
    List<List<Object>> dataList = new ArrayList<>();
    // 表头合并的逻辑
    List<CellRangeAddress> cellRangeAddressList = new ArrayList<>();
    // 组装账户信息总览 导出数据
    builidAccountOverviewExportData(
        exportItem, bankAccountOverviewList, headList, dataList, cellRangeAddressList);

    String fileName = "信息总览.xlsx";
		// 调用EasyExcel 方法输出文件流
    try {
      HttpServletResponse response = ServletUtils.getResponse();
      response.setContentType("application/msexcel;charset=utf-8");
      response.setHeader(
          "content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "utf-8"));
      OutputStream out = response.getOutputStream();
      EasyExcel.write(out)
          .head(headList) // 设置表头数据
          .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25)) // excel 样式设置
          .autoCloseStream(Boolean.TRUE) // 自动关闭文件流
          .sheet("信息总览")
          .doWrite(dataList); // 数据list
      // 开始导出
    } catch (Exception e) {
      LoggerUtils.error(e.getMessage());
      return false;
    }
    return true;
  }

数据组装方法

builidAccountOverviewExportData

主要实现的原理是通过List<Integer> exportItem 来判断需要导出的tab块。

其中使用了 getApiModelName(OverviewBankBookOcceVO.class); 方法映射对象的字段名进行快捷组装。

private void builidAccountOverviewExportData(
      List<Integer> exportItem,
      List<BankAccountOverviewVO> bankAccountOverviewList,
      List<List<String>> headList,
      List<List<Object>> dataList,
      List<CellRangeAddress> cellRangeAddressList) {
    // --------------表头拼接-------------
    // 账户信息
    List<String> bankBookHead = new ArrayList<>();
    bankBookHead.add("企业主体编码");
    bankBookHead.add("企业主体名称");
    for (String head : bankBookHead) {
      List<String> bankBookHeadTitle = new ArrayList<>();
      bankBookHeadTitle.add(head);
      headList.add(bankBookHeadTitle);
    }
	// 字段下标!!!!!!!!!!
    int index = 13;
    if (CollectionUtils.isNotEmpty(exportItem)) {
      // 账面发生额
      if (exportItem.contains(BankAccountOverviewExportTypeEnum.BANK_BOOK_OCCE.getValue())) {
        List<String> apiModelNameList = getApiModelName(OverviewBankBookOcceVO.class);
        for (String apiModelName : apiModelNameList) {
          List<String> bankBookOccHeadTitle = new ArrayList<>();
          bankBookOccHeadTitle.add("账面发生额");
          bankBookOccHeadTitle.add(apiModelName);
          headList.add(bankBookOccHeadTitle);
        }
        //      // 需要合并的表头位置  (起始行,结束行,起始列,结束列)
        //      int size = apiModelNameList.size();
        //      CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, index, index + size -
        // 1);
        //      cellRangeAddressList.add(cellRangeAddress);
        //      index += size;
      }

      // 发生额调节表
      if (exportItem.contains(BankAccountOverviewExportTypeEnum.OCC_ADJUSTMENT.getValue())) {
        List<String> apiModelNameList = getApiModelName(OverviewOccAdjustmentVO.class);
        for (String apiModelName : apiModelNameList) {
          List<String> occAdjustmentInfoHeadTitle = new ArrayList<>();
          occAdjustmentInfoHeadTitle.add("发生额调节表");
          occAdjustmentInfoHeadTitle.add(apiModelName);
          headList.add(occAdjustmentInfoHeadTitle);
        }
      }

      // 网银流水
      if (exportItem.contains(BankAccountOverviewExportTypeEnum.EBANK_FLOW.getValue())) {
        List<String> apiModelNameList = getApiModelName(OverviewEbankFlowVO.class);
        for (String apiModelName : apiModelNameList) {
          List<String> ebankFlowHeadTitle = new ArrayList<>();
          ebankFlowHeadTitle.add("网银流水");
          ebankFlowHeadTitle.add(apiModelName);
          headList.add(ebankFlowHeadTitle);
        }
      }

      // 核对余额
      if (exportItem.contains(BankAccountOverviewExportTypeEnum.RECONCILE_BALANCE.getValue())) {
        List<String> apiModelNameList = getApiModelName(OverviewReconcileBalanceVO.class);
        for (String apiModelName : apiModelNameList) {
          List<String> reconcileBalancesHeadTitle = new ArrayList<>();
          reconcileBalancesHeadTitle.add("核对余额");
          reconcileBalancesHeadTitle.add(apiModelName);
          headList.add(reconcileBalancesHeadTitle);
        }
        // 需要合并的表头位置  (起始行,结束行,起始列,结束列)
        int size = apiModelNameList.size();
        CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, index, index + size - 1);
        cellRangeAddressList.add(cellRangeAddress);
        index += size;
      }

      // 双向核对结果
      if (exportItem.contains(BankAccountOverviewExportTypeEnum.CHECK_RESULT.getValue())) {
        List<String> apiModelNameList = getApiModelName(OverviewCheckResultVO.class);
        for (String apiModelName : apiModelNameList) {
          List<String> checkResultHeadTitle = new ArrayList<>();
          checkResultHeadTitle.add("双向核对结果");
          checkResultHeadTitle.add(apiModelName);
          headList.add(checkResultHeadTitle);
        }
      }
    }

    // ----------------组装数据-------------
    for (BankAccountOverviewVO bankAccountOverview : bankAccountOverviewList) {
      List<Object> data = new ArrayList<>();
      // 账户信息总览
      data.add(bankAccountOverview.getCompanyId());
      data.add(bankAccountOverview.getCompanyName());
      String checkPlanFlag = bankAccountOverview.getCheckPlanFlag();
      if (StringUtils.isNotEmpty(checkPlanFlag)) {
        checkPlanFlag = checkPlanFlag.replaceAll("0", "是");
        checkPlanFlag = checkPlanFlag.replaceAll("1", "否");
      }
      data.add(checkPlanFlag);
      data.add(bankAccountOverview.getNoCheckReason());
      // -------动态表格数据组装-----
      if (CollectionUtils.isNotEmpty(exportItem)) {
        // 账面发生额
        if (exportItem.contains(BankAccountOverviewExportTypeEnum.BANK_BOOK_OCCE.getValue())) {
          data.add(bankAccountOverview.getBankBookOccInfo().getOpenBalance());
          data.add(bankAccountOverview.getBankBookOccInfo().getCurrentIssueAdd());
          data.add(bankAccountOverview.getBankBookOccInfo().getCurrentIssueReduce());
          data.add(bankAccountOverview.getBankBookOccInfo().getBalance());
          data.add(bankAccountOverview.getBankBookOccInfo().getOpenBalanceF());
          data.add(bankAccountOverview.getBankBookOccInfo().getCurrentIssueAddF());
          data.add(bankAccountOverview.getBankBookOccInfo().getCurrentIssueReduceF());
          data.add(bankAccountOverview.getBankBookOccInfo().getBalanceF());
        }

        // 发生额调节表
        if (exportItem.contains(BankAccountOverviewExportTypeEnum.OCC_ADJUSTMENT.getValue())) {
          data.add(bankAccountOverview.getOccAdjustmentInfo().getCurrentIssueAdd());
          data.add(bankAccountOverview.getOccAdjustmentInfo().getCurrentIssueReduce());
        }

        // 网银流水
        if (exportItem.contains(BankAccountOverviewExportTypeEnum.EBANK_FLOW.getValue())) {
          data.add(bankAccountOverview.getEbankFlowInfo().getOpenBalance());
          data.add(bankAccountOverview.getEbankFlowInfo().getCurrentIssueAdd());
          data.add(bankAccountOverview.getEbankFlowInfo().getCurrentIssueReduce());
          data.add(bankAccountOverview.getEbankFlowInfo().getBalance());
        }

        // 核对余额
        if (exportItem.contains(BankAccountOverviewExportTypeEnum.RECONCILE_BALANCE.getValue())) {
          data.add(bankAccountOverview.getReconcileBalances().getBalanceVerify());
          data.add(bankAccountOverview.getReconcileBalances().getDebitOccFVerify());
          data.add(bankAccountOverview.getReconcileBalances().getCreditOccFVerify());
          data.add(bankAccountOverview.getReconcileBalances().getNetAmountVerify());
        }

        // 双向核对结果
        if (exportItem.contains(BankAccountOverviewExportTypeEnum.CHECK_RESULT.getValue())) {
          data.add(bankAccountOverview.getCheckResult().getDebitOccF());
          data.add(bankAccountOverview.getCheckResult().getCreditOccF());
          data.add(bankAccountOverview.getCheckResult().getDebitRatio());
          data.add(bankAccountOverview.getCheckResult().getCreditRatio());
          data.add(bankAccountOverview.getCheckResult().getUntreatedProject());
          data.add(bankAccountOverview.getCheckResult().getExceptionProject());
        }
      }
      dataList.add(data);
    }
  }

getApiModelName 方法代码如下,因为项目引入了 swagger 所以数据接口对象都会使用到 @ApiModelProperty 注解 如下图所示。通过反射获取实体类的对应属性的注解名称list。

@Data
@ApiModel(value = "vo对象", description = "vo对象")
public class OverviewBankBookOcceVO {
  @ApiModelProperty(value = "银行账号")
  private String bankAccount;

  @ApiModelProperty("期初余额(原币)")
  private BigDecimal openBalance;
}
/**
   * @description 获取对象中 api 注解的名称
   * @params [object]
   * @return
   */
  private List<String> getApiModelName(Object object) {
    Class<T> aClass = (Class<T>) object;
    Field[] fields = aClass.getDeclaredFields();
    List<String> apiModelName = new ArrayList<>();
    for (Field field : fields) {
      ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
      String value = annotation.value();
      if (field.getName().equals("bankAccount")) {
        continue;
      }
      apiModelName.add(value);
    }
    return apiModelName;
  }

本文由 SoGeek_Studio 发布,有任何问题请留言评论,欢迎指正。文章来源地址https://www.toymoban.com/news/detail-479433.html

到了这里,关于EasyExcel动态头导出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 利用Easyexcel动态导出表头列

    其中 fieldName 为要导出的字段名称 也就是 数据对象 中与之对应的字段名称 headName 为与字段对应的表头(我这里默认用的就是导出表头集合中字段排序就是导出的表头排序 如有需要,可以自己定义导出表头顺序) 导出util类,直接上代码 其中  CellStyle() 是设置的默认样式 

    2024年02月11日
    浏览(41)
  • Java——使用EasyExcel导出动态列的Excel

    多多点赞,会变好看! 多多留言,会变有钱! 有些时候列表的列可能是动态的,需要根据动态表头导出Excel文件,这时候可以使用下面的方法解决: 静态列导出代码:

    2024年02月15日
    浏览(46)
  • EasyExcel导出工具类(支持模板导出多Sheet导出)

    最近写需求发现没有顺手excel导出工具类, 于是自己造了个小轮子, 链式一\\\".\\\"到底, 代码既注释 特点: 支持多sheet 支持从模板导出 支持分页拿数据, 避免数据量过大一次拿出导致内存溢出 数据类型支持业务实体类或Map, 无需easyExcel的注解, 低侵入   over

    2024年02月16日
    浏览(43)
  • EasyExcel的简单导出

    EasyExcel的简单导出 Controller层代码 Service处理代码 SysColExcelDto.java类 这是使用easyExcel提供的注解来标记字段填充行数,这种情况适用于自动生成,如果是填充excel(doFill方式)可以不用ExcelProperty注解标识,但是需要在模板中标记数据填充位置 模板标记数据填充位置标记如下,

    2024年02月15日
    浏览(38)
  • EasyExcel导入和导出数据

    1.cmtroller 调用service方法,完成导出 2.service 调用工具类的方法完成导出 传入response,标题控制类(标题名称,合并的列数),员工列表,文件名称,excel的标题名称,要导出的数据类 3.工具类中的方法 4.控制标题类 这个类控制数据之前的显示内容 效果 2022-10-28 乱码解决 因为文件

    2023年04月09日
    浏览(38)
  • EasyExcel导出Excel文件

    方法一 导入EasyExcel依赖 创建实体类 OrderServiceImpl 如果希望多个sheet导出那么可以 测试类 方法二 导入EasyExcel依赖 编写ExcelUtil 编写Service层代码 controller层代码 方法一与方法二都使用了EasyExcel进行Excel的导出,区别在于方法一建立了实体类进行Excel的导出,这样的好处是可以直

    2024年02月14日
    浏览(39)
  • 使用EasyExcel模版导出

    easyexcel官方文档 填充Excel | Easy Excel 官方demo是利用本地模版文件填充并下载到本地 我用的是web项目,将输出改为了输出流 OutputStream  模版: 效果: 使用模版文件有两种方式,使用其中一种就可以:     1.文件路径:.withTemplate(templateFileName)     2.输入流:.withTemplate(inputS

    2024年02月14日
    浏览(32)
  • easyexcel 导出

     在使用EasyExcel库进行数据写入时,通常我们会使用实体类来存储数据。但是当遇到动态查询,无法确定属性数量和名称时,就需要使用Map来接收数据。然而,直接将Map中的数据写入Excel表格并不是一件简单的事情。接下来,我将介绍如何使用EasyExcel库将Map数据写入Excel表格。

    2024年02月04日
    浏览(30)
  • easyExcel合并单元格导出

    (很多旧项目自定义了一套Excel导出工具,poi版本可能不兼容,一般poi新旧版本不兼容分界线在3.17,选择3.17版本不会发生代码不兼容情况)

    2024年02月09日
    浏览(44)
  • EasyExcel 批量导出

    上篇写了数据导入,本文补充一下EasyExcel 批量导出 包括常规excel和复杂excel 通过重写 sheetDynamicHead 方法自定义复杂表头 @ExcelProperty(order = 0) 注解指定excel列即可填充到指定单元格 protected List sheets() 方法内返回多个sheet protected List sheetData(int sheetIndex)方法内指定sheet填充的数据

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包