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對應的單元格之內。

上述部分具體詳情不做贅述,有興趣的童鞋歡迎一起交流👉@誰與

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章