java集成poi报表,导出xls、xlsx,表头,内容,sheet动态数据填充,局部单元格颜色字体设置

需求:自动化测试导出Excel分析数据(其中Excel文件满足同时导出多张sheet表,表头、内容数据动态添加,局部单元格的内容需根据是否设置高亮文本的标准,高亮标识,并统计分析测试召回数目详情)

效果如下图:

首先,抛下那些曾遇到过的坑:

java对poi报表的集成,google一下,导出xls、xlsx文件的说法一大堆,当然如果想找到自己想要的答案,那就需要花点时间去整合了(从海量的数据里快速挑选符合自己预期的结果),这里列举一个比较典型的坑,可能在导出Excel的时候,代码中只支持2003xls格式,却没有支持2007、2010的xlsx,于是立刻升级,很开心奇葩就在此刻出现了:java.lang.NoSuchMethodError: org.apache.poi.util.POILogger.log(I[Ljava/lang/Object;)V.

于是乎各种搜索,有时候还在国内的网站不一定能检索到符合自己的解决方案,我们来先分析一下,这个报错的原因可能的情况有哪些???其实,最可能的原因就是poi的jar包同时使用多个版本(博主这边用的3.17版本),但在升级的时候早已经把旧的jar从java build path里面删除了,但是这个错误依然很任性的存在,这里提供一种万能检测类文件走哪个jar包的代码,迷茫时不妨试试看:

ClassLoader classloader = org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource("org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
logger.info("poi core come from {}", path);
classloader = org.apache.poi.POIXMLDocument.class.getClassLoader();
res = classloader.getResource("org/apache/poi/POIXMLDocument.class");
path = res.getPath();
logger.info("poi ooxml come from {}", path);
classloader = org.apache.poi.hslf.HSLFSlideShow.class.getClassLoader();
res = classloader.getResource("org/apache/poi/hslf/HSLFSlideShow.class");
path = res.getPath();
logger.info(("poi scratchpad come from {}", path);

果不其然,的确有一个class走了旧包,只删java build path没生效。这时,恍然大悟,把workspace里面的包删了再把project clean一下,run,o了,解决了!

当然这只是其中一个很小的坑,大坑比比皆是,毕竟网上罗列的解决方法只是从个人的层面发起的,博主建议咱还是走官方的demo,少走点弯路?https://poi.apache.org/apidocs/3.17/

OK,Now,说到两种格式的导出,现在正式进入主题:

xls、xlsx文件分别对应的class:

HSSFWorkbook、... XSSFWorkbook、... 

多张sheet表用动态的数据填充表头、内容:

可通过两个维度解决,一个y轴(纵向),一个x轴(横向),即List<List> list可实现,list.get(0)即为动态填充表头的数据,再依次填充每一个对应单元格的内容,以此类推.....

局部单元格文本内容按flag高亮标识,并统计召回:

先贴一段代码:

获取XSSFRichTextString对象:

XSSFRichTextString ts = new XSSFRichTextString(StringUtils.isBlank(cell.getStringCellValue()) ? null : cell.getStringCellValue());

其中,着重介绍下ts.applyFont()方法跟高亮标识Flag:

start、end是设置需要高亮标识的区间段,第三个参数是set对应样式的字体索引,博主这边设置的是RED.Index().

高亮标识这里采用等差数列:

(i - 1) / 8) * 8 + 2(公差d=8,首项为2,n根据i动态变化,i这里是记录遍历list的次数)

来计算标准串所在数组里的下标。

统计召回数目详情:

因为接口返回数据是分页的,所以这里采用递归的方式去计算待召回具体所在的页数、个数等等,并动态填充到Excel对应的单元格之内。

上述部分具体详情不做赘述,有兴趣的童鞋欢迎一起交流?@谁与

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值