一、需求

公司项目的一个功能,导出账户信息excel表格,不同的账户类型除开所要展示的固定表头字段,还要展示每个账户类型所有的特殊字段,并且将所有账户类型的数据全部展示在同一个的excel文件的不同sheet表单中,由于项目在内网系统开发,没有相关图片展示,需求和这篇博客相似—>需求详情。

二、代码实现

要实现具体功能,要确定表头,表数据

1、获取账户所特有的表头字段

项目中有张模板表单独存储各个账户类型所特有的字段

/*** 根据账户类型代码和业务类型代码获取模板库中的key作为表头* @param  accountType  账户类型代码* @param businessTypeCode  业务类型代码* @return List<string>*/
public List<String> getHeadKeys(String accountType, String businessTypeCode) {//存放模板库中所有的key作为特殊表头List<String> listKey = new ArrayList<>();//根据账户类型代码和业务类型代码集合找到所有的模板 List<AccountAttributeDO> accountAttributeDOS = accountAttributeMapper.selectoneAccountAttribute(accountType, businessTypecode);if(CollectionUtils.isEmpty(accountAttiibutedos)) {return listkey; }try {for (AccountAttributeDO accountAttributeDO : accountAttributeDOS) {//表头字段存放在attributeModel字段中,采用json数组字符串方式存储,需要先转为json,其中indexName为表头名字String attributeModel = accountAttributeDO.getAttributeModel(); JSONArray jsonArray = JSON.parseArray(attributeModel); for (int i = 0; i < jsonArray.size(); i++) {String indexName jsonArray.getJSONObject(i).get("indexName").toString();if (!listKey.contains(indexName)) {listKey.add(indexName);}}}} catch (Exception e) {log.error("string数据转JSON失败")}return listkey;
}
2、将固定表头和特殊表头拼接

固定字段被封装成一个实体类并采用了EasyExcel中的@ExcelProperty注解标注每个属性,将注解的value值设为表头名字

/*** excel表中表头* @param clazz 某类* @param listKey 特有表头集合* @return List<List<String>>*/
private static List<List<String>> head(Class<?> clazz, List<String> listkey) {List<List<String>> list = new ArrayList<>(); List<String> listHeads = new Arraylist<>();//通过实体类@ExcelProperty注解获取固定表头,存到listHeads中Field[] declaredFields = clazz.getDeclaredFields(); for (Field declaredfield : declaredfields) {Annotation[] annotations = declaredField.getAnnotations(); for (Annotation annotation : annotations) {String[] valueHead =((ExcelProperty) annotation).value(); for (String s : valueHead) {listHeads.add(s);}}}//将listHeads存到list中for (String formHead : listHeads) {List<String> head = new Arraylist<>(); head.add(formHead);list.add(head);}//将每个账户类型所特有的表头存到list中listKey.forEach(item -> list.add(Collections.singletonList(item)));return list;
}
3、将表头所对应的数据取出存到List<List<String>>类型中
/** * excel表中的数据集合* @param accountInfolist 数据集* @param listkey 表头集合* @return List<list<String>>*/private static list<list<String>> dataListNew(List<AccountInfoQueryBO> accountInfolist, List<String> listKey) {List<List<String>> list = new ArrayList<>();for(AccountInfoQueryBO accountInfoQueryBO : accountInfoList) {//遍历账户信息数据List<String> data = new ArrayList<>();//取出固定表头数据存入data中data.add(accountInfoQueryBO.getProductCode());data.add(accountInfoQueryBO.getProductName());data.add(accountInfoQueryBO.getProductStatus());data.add(accountInfoQueryBO.getAccountType());data.add(accountInfoQueryBO.getBusinessType()); data.add(accountInfoQueryBO.getBranchName());//特有表头字段的数据以json型字符串存在accountAttribute字段中String accountAttribute = accountInfoQueryBO.getAccountAttributeList().get(0);try {//将json字符串转为json数据JSONObject mapAccountAttribute = JSON.parseObiect(accountAttribute);for (String key : listKey) {if (!mapAccountAttribute.containsKey(key)) {data.add("");} else {//将特有表头字段数据取出放入data中data.add(mapAccountAttribute.get(key).tostring());}}} catch(Exception e) {log.error("String数据转JSON失败");}list.add(data);}return list;}
}
4、生成excel表单
/*** 将文件转换成流* @param <T> 类模板* @param criteria 查询条件* @return java.io.outputstream*/public <T> ByteArrayOutputStream exportNewLast(AccountInfoCriteria criteria) {//初始化字节组输出流ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ExcelWriter excelWriter = EasyExcelFactory.write(outputStream).build();//从查询条件中获取账户类型集合List<String> accountTypeCodeList = criteria.getAccountTypeCode(); if (CollectionUtils.isEmpty(accountTypeCodeList)) {accountTypeCodeList = null;}//根据账户类型集合查询账户类型代码和其对应的名字List<AccountTypeNameDO> accountTypeNameDOS = accountTypeMapper.selectAccountTypeCodeAndName(accountTypeCodeList); //根据accountTypeNameDOS的size确定到导出几个账户类型的数据for (int i = 0; i < accountTypeNameDOS.size(); i++) {Long startTime = System.currentTimeMillils();List<String> newAccountTypecodelist = new ArrayList<>();//取出账户类型代码String accountType = accountTypeNameDOS.get(i).getAccountType();//取出账户类型String accountTypeName = accountTypeNameDOS.get(i).getAccountTypeName();log.info("导出SHEET【{}】账户数据开始", accountTypeName);newAccountTypeCodeList.add(accountrype);//为查询条件设置账户类型代码,这样一次就查出同一个账户类型下的所有数据criteria.setAccountTypeCode(newAccountTypecodeList);String businessTypecode = criteria.getBusinessTypeCode(); //根据查询条件查询账户信息List<AccountInfoQueryBO> accountInfoList = getAccountInfoListNew(criteria);//根据账户类型代码和业务类型代码获取对应的特有表头集合List<String> headKeys = getHeadKeys(accountType, businessTypeCode);//查出表数据List<List<String>> dataList = dataListNew(accountInfoList, headKeys);//创建sheetWriteSheet writesheet = EasyExcelFactory.writeSheet(i,accountTypeName).head(head(AccountInfoExportBO.class, headKeys).build(); //写入数据excelWriter.write(dataList,writeSheet);log.info("导出SHEET【{}】账户数据结束,耗时【{}】ms", accountTypeName, System.currentTimeMillis() - startTime);}excelWriter.finish();return outputStream;
}

工作记录:EasyExcel对于不定长Excel表头的处理,写excel相关推荐

  1. python读取excel表头_13-用 Python 读写 Excel 文件

    在以前,商业分析对应的英文单词是Business Analysis,大家用的分析工具是Excel,后来数据量大了,Excel应付不过来了(Excel最大支持行数为1048576行),人们开始转向pyt ...

  2. c语言编写excel程序,C语言写excel文件(csv格式)

    csv:简化版excel,在PC机上等同于excel,可进行各种excel计算.画图. #defineEACH_FILE_MAX_BYTE52428800 //-------------------- ...

  3. EasyExcel 对于不定长Excel表头(动态表头)的处理

    需求 最近在做公司自己的工作流项目,不同的项目-业务 除开固定字段,都可自定义不同的字段以便不同的业务处理不同的工作流,其中关于报表的excel导出时,要求除开必要的字段,还需要导出自定义所需的字段. ...

  4. excel表头_如何用Excel制作出库入库表

    有一些工作要求我们制作一个出库入库的记录表格,那么今天这篇文章就教大家如何用Excel制作出库入库表. 首先我们在Excel表格中框出一些表格,作为这个表的整体结构: 然后如图所示,用合并居中按钮调节 ...

  5. java导出excel表头跨行,java导出Excel并对表头做定制

    1.核心代码 package cn.doofen.service.impl; import java.io.OutputStream; import java.text.DecimalFormat; ...

  6. java导出excel表头斜线_Java导出Excel三表头

    1.问题背景 Java导出Excel表格时,表头出现了三个,即多表头Excel 2.实现源码 /** * * @Project:Report * @Title:ThreeHead.java * @Pa ...

  7. python做excel表格代码_Python读写Excel表格

    最近在做一些数据处理和计算的工作,因为数据是以.CSV格式保存的,因此刚开始直接用Excel来处理. 但是做着做着发现重复的劳动,其实并没有多大的意义,于是就想着写个小工具帮着处理. 以前正好在一本书 ...

  8. python写入excel表格_Python读取写入Excel表格

    原博文 2019-08-27 15:35 − Python操作Excel,主要用到xlrd和xlwt这两个库,即xlrd是读Excel,xlwt是写Excel的库 1.Python读取Excel表格 ...

  9. python处理excel表格实例-python读写Excel表格的实例代码

    本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 安装两个库:pip install xlrd.pip install xlwt 1.python读excel--xl ...

最新文章

  1. 真学霸不愁钱,传递社会正能量 - 我看华为百万年薪招聘天才少年
  2. python遗传算法工具包_Deap: python中的遗传算法工具箱
  3. 企业网络推广浅析网站首页什么样的布局有利于优化?
  4. Apache ZooKeeper - ZK的ACL权限控制( Access Control List )
  5. Spring AOP详解一文搞懂@Aspect、@Pointcut、@Before、@Around、@After、@AfterReturning、@AfterThrowing
  6. canvas系列教程02-直线和曲线
  7. 高手教你如何用香技巧香水达人教你用香省钱法 - 生活至上,美容至尚!
  8. Android成长日记-使用GridView显示多行数据
  9. 笔者使用macOS的一些经验点滴记录1
  10. 零基础入门语义分割——Task2 数据扩增
  11. PHP Windows系统下调用OpenOffice
  12. 平衡二叉树(AVL Tree)
  13. CnPack常用的功能,太方便了!
  14. CAD2016入门教程
  15. JavaScript实现动态显示时间
  16. JTA transaction unexpectedly rolled back (maybe due to a timeout)
  17. 数据结构基础之堆排序
  18. PostgreSQL 中 sequence 的用法
  19. 如何选择优化器 optimizer
  20. final 关键字:用来修饰类,方法,成员变量,局部变量

热门文章

  1. redis和mysql的异步更新
  2. Linux实现上传文件到百度网盘
  3. (ZZ) 剖析系统虚拟化(6)——Virtual Switch功能介绍
  4. 2022高考全国新一卷最后一个大题解答
  5. 海外社交媒体YouTube的营销推广策略与技巧
  6. 工作可以暂时缓缓。找女朋友要紧呐!
  7. gff3转mysql_科学网—把GFF3文件导入MySQL数据库 - 闫双勇的博文
  8. Command Injection命令注入攻击
  9. oracle 分批提取数据,Oracle创建关系分批抽取测试数据
  10. 神经网络编译器TVM