我的编程空间,编程开发者的网络收藏夹
学习永远不晚

EasyExcel动态头导出

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

EasyExcel动态头导出

前言

这段时间的项目中需要导出动态表格。
根据所选的参数导出对应的字段内容
在这里插入图片描述

下图所示选择下面几个tab页就需要导出对应的表头字段
在这里插入图片描述

下面为具体实现的效果。表头样式可以通过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 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;}
  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://blog.csdn.net/Harswlgb/article/details/130411747

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

EasyExcel动态头导出

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

EasyExcel动态头导出

前言 这段时间的项目中需要导出动态表格。 根据所选的参数导出对应的字段内容 下图所示选择下面几个tab页就需要导出对应的表头字段 下面为具体实现的效果。表头样式可以通过EasyExcel 提供的方法自定义。 具体实现 主要是通过 传
2023-08-23

Java怎么用EasyExcel解析动态表头并导出

本文小编为大家详细介绍“Java怎么用EasyExcel解析动态表头并导出”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么用EasyExcel解析动态表头并导出”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
2023-07-04

Java利用EasyExcel解析动态表头及导出实现过程

以前做导出功能,表头和数据都是固定的,下面这篇文章主要给大家介绍了关于Java利用EasyExcel解析动态表头及导出实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-12-08

Java easyExcel的多级表头怎么导入

这篇文章主要介绍了Java easyExcel的多级表头怎么导入的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java easyExcel的多级表头怎么导入文章都会有所收获,下面我们一起来看看吧。首先要了解ea
2023-07-02

java如何使用EasyExcel导入导出excel

这篇文章主要介绍了java如何使用EasyExcel导入导出excel,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、准备工作1、导包
2023-06-15

Spring Boot + EasyExcel实现数据导入导出

这篇文章主要介绍了Spring Boot+EasyExcel实现数据导入导出,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
2022-11-13

使用EasyExcel实现Excel的导入导出

文章目录 前言一、EasyExcel是什么?二、使用步骤1.导入依赖2.编写文件上传配置3.配置表头对应实体类4.监听器编写5.控制层6.前端代码 总结 前言 在真实的开发者场景中,经常会使用excel作为数据的载体,进行
2023-08-17

Spring Boot + EasyExcel导入导出,简直太好用了!

本篇文章基于SpringBoot集成EasyExcel的实现展开,为大家讲解了EasyExcel在实践中的具体运用。大家可根据需要,进行变通处理。同时,基于自定义转换器、自定义策略、自定义监听器等形式达到灵活适用于各种场景。希望本篇文章能给

Java+EasyExcel如何实现文件的导入导出

这篇文章将为大家详细讲解有关Java+EasyExcel如何实现文件的导入导出,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。引言项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息,导
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录