POI创建的文档具有不同条件的灵活样式
介紹
這篇文章解釋了基于各種標準將樣式應用于文檔的困難并提供了解決方案。 Java編程中的常見任務之一是根據存儲在數據庫中的數據創建Excel報告。 在這些情況下,Java程序員使用POI :-)。 這些報告通常具有嚴格的樣式和數據格式規則。 數據通常是SQL查詢執行的結果。
通常的目標是將其變為:
到這個:
問題
這里的問題是樣式可以基于不同的標準來應用。 例如,數字可以用小數點分隔符后面的不同位數來格式化。 日期可能需要使用特殊格式進行格式化。 最后但并非最不重要的是,可能需要用顏色選擇某些列或行。
在代碼中“直接”應用這些樣式將導致許多難以閱讀和維護的代碼。 每次報表樣式更改時,可能都需要更改許多代碼。
如果樣式可以像謂詞一樣具有“樣式”,并且可以根據該謂詞來應用,那就太好了。 但是如何執行他的?
解
所提出的解決方案解決了謂詞問題。 我將此解決方案與POI結合使用來生成報告,因此大多數情況下,我會假定使用了類似POI的庫。
樣式圖生成
在執行任何文檔創建操作之前,必須創建樣式圖。 此樣式圖將包含映射到鍵的樣式。 鍵必須包含所有可能影響樣式的值。 例如,值的類型(在Java中),行號,列號和值本身。
該地圖將如下所示:
密鑰序列生成
這個想法是生成一個鍵列表(java.util.List),以正確的順序進行嘗試。 該列表用于定義對象的樣式。 列表中的每個鍵都以迭代順序進行嘗試,直到樣式圖中的一個鍵值為止。
一般的想法是從更詳細的鍵開始,并填寫所有值,最后以可應用于任何單元格的最通用樣式結束。
例如(ri是行索引,ci是列索引):
List<CellStyleKey> allKeys = new ArrayList<>(); if (val != null) {if ((ri != null) || (ci != null)) {allKeys.add(new CellStyleKey(val, val.getClass(), ri, ci));allKeys.add(new CellStyleKey(val, val.getClass(), ri, null));allKeys.add(new CellStyleKey(val, val.getClass(), null, ci));allKeys.add(new CellStyleKey(val, val.getClass(), null, null));allKeys.add(new CellStyleKey(null, val.getClass(), ri, ci));allKeys.add(new CellStyleKey(null, val.getClass(), ri, null));allKeys.add(new CellStyleKey(null, val.getClass(), null, ci));allKeys.add(new CellStyleKey(null, val.getClass(), null, null));} else {allKeys.add(new CellStyleKey(val, val.getClass(), null, null));allKeys.add(new CellStyleKey(null, val.getClass(), null, null));} } allKeys.add(new CellStyleKey(null, null, ri, ci)); allKeys.add(new CellStyleKey(null, null, ri, null)); allKeys.add(new CellStyleKey(null, null, null, ci)); allKeys.add(new CellStyleKey(null, null, null, null));在此代碼中,最詳細的鍵是包含所有值的鍵:值,類,行號和列號。 最不詳細的鍵不包含任何值。
樣式圖生成
對于列表中的每個鍵(列表應盡可能短),對樣式圖執行get操作。 如果樣式圖具有此鍵的值,則為樣式。
結論
此方案允許將樣式簡單但靈活地分配給Excel文檔中的行/列/值/類。
翻譯自: https://www.javacodegeeks.com/2019/05/flexible-styling-varying-criteria-poi-created-documents.html
總結
以上是生活随笔為你收集整理的POI创建的文档具有不同条件的灵活样式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ziplinux解压命令(zip lin
- 下一篇: 安卓3d网游(3d安卓h游)