工作记录:EasyExcel对于不定长Excel表头的处理,写excel
一、需求
公司项目的一个功能,导出账户信息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相关推荐
- python读取excel表头_13-用 Python 读写 Excel 文件
在以前,商业分析对应的英文单词是Business Analysis,大家用的分析工具是Excel,后来数据量大了,Excel应付不过来了(Excel最大支持行数为1048576行),人们开始转向pyt ...
- c语言编写excel程序,C语言写excel文件(csv格式)
csv:简化版excel,在PC机上等同于excel,可进行各种excel计算.画图. #defineEACH_FILE_MAX_BYTE52428800 //-------------------- ...
- EasyExcel 对于不定长Excel表头(动态表头)的处理
需求 最近在做公司自己的工作流项目,不同的项目-业务 除开固定字段,都可自定义不同的字段以便不同的业务处理不同的工作流,其中关于报表的excel导出时,要求除开必要的字段,还需要导出自定义所需的字段. ...
- excel表头_如何用Excel制作出库入库表
有一些工作要求我们制作一个出库入库的记录表格,那么今天这篇文章就教大家如何用Excel制作出库入库表. 首先我们在Excel表格中框出一些表格,作为这个表的整体结构: 然后如图所示,用合并居中按钮调节 ...
- java导出excel表头跨行,java导出Excel并对表头做定制
1.核心代码 package cn.doofen.service.impl; import java.io.OutputStream; import java.text.DecimalFormat; ...
- java导出excel表头斜线_Java导出Excel三表头
1.问题背景 Java导出Excel表格时,表头出现了三个,即多表头Excel 2.实现源码 /** * * @Project:Report * @Title:ThreeHead.java * @Pa ...
- python做excel表格代码_Python读写Excel表格
最近在做一些数据处理和计算的工作,因为数据是以.CSV格式保存的,因此刚开始直接用Excel来处理. 但是做着做着发现重复的劳动,其实并没有多大的意义,于是就想着写个小工具帮着处理. 以前正好在一本书 ...
- python写入excel表格_Python读取写入Excel表格
原博文 2019-08-27 15:35 − Python操作Excel,主要用到xlrd和xlwt这两个库,即xlrd是读Excel,xlwt是写Excel的库 1.Python读取Excel表格 ...
- python处理excel表格实例-python读写Excel表格的实例代码
本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 安装两个库:pip install xlrd.pip install xlwt 1.python读excel--xl ...
最新文章
- 真学霸不愁钱,传递社会正能量 - 我看华为百万年薪招聘天才少年
- python遗传算法工具包_Deap: python中的遗传算法工具箱
- 企业网络推广浅析网站首页什么样的布局有利于优化?
- Apache ZooKeeper - ZK的ACL权限控制( Access Control List )
- Spring AOP详解一文搞懂@Aspect、@Pointcut、@Before、@Around、@After、@AfterReturning、@AfterThrowing
- canvas系列教程02-直线和曲线
- 高手教你如何用香技巧香水达人教你用香省钱法 - 生活至上,美容至尚!
- Android成长日记-使用GridView显示多行数据
- 笔者使用macOS的一些经验点滴记录1
- 零基础入门语义分割——Task2 数据扩增
- PHP Windows系统下调用OpenOffice
- 平衡二叉树(AVL Tree)
- CnPack常用的功能,太方便了!
- CAD2016入门教程
- JavaScript实现动态显示时间
- JTA transaction unexpectedly rolled back (maybe due to a timeout)
- 数据结构基础之堆排序
- PostgreSQL 中 sequence 的用法
- 如何选择优化器 optimizer
- final 关键字:用来修饰类,方法,成员变量,局部变量