0 程式碼量雜談
在使用POI匯出Excel檔案時,如果某個單元格需要設定成下拉選擇的方式,並且下拉選單數目大於255時,直接寫序列將會報錯:
java.lang.IllegalArgumentException: String literals in formulas can't be bigger than 255 characters ASCII
此時可以增加一個隱藏的Sheet,然後在需要設定下拉的單元格中進行引用。也就是說單元格的來源直接這樣指定:
=$A$1:$A$5
但這樣做沒有辦法進行模糊匹配,因此再通過Excel的OFFSET等函式可以達到要求。
Java程式碼實現如下:
CellRangeAddressList regions = new CellRangeAddressList(1, 10000, 0, 0);
DVConstraint constraint = DVConstraint.createFormulaListConstraint("OFFSET(deviceTypeSheet!$A$1,MATCH(A6&\"*\"," +
"deviceTypeSheet!$A:$A,0)-1,,COUNTIF(deviceTypeSheet!$A:$A,A6&\"*\"),)");
HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraint);
// 設定輸入無效資料時不顯示出錯警告
dataValidation.setShowErrorBox(false);
sheet.addValidationData(dataValidation);
其中最關鍵的就是通過createFormulaListConstraint設定的語句:
OFFSET(deviceTypeSheet!$A$1,MATCH(A6&"*",deviceTypeSheet!$A:$A,0)-1,,COUNTIF(deviceTypeSheet!$A:$A,A6&"*"),)
這幾個函式的說明如下:
OFFSET(reference,rows,cols,height,width): 表示對某個區域的引用,refrerence指明的是區域,rows指明需要引用的開始行,cols表示的是需要引用該區域的開始列;height表示的是引用的區域行數;width表示的是引用的區域的列數;
如offset(
A
1, 2, 2, 4, 4)表示的是引用從A
1這個點第3行第3列開始,跨度為3行4列的區域。 MATCH(lookup_value,lookuparray,match-type): 表示從lookuparray中查詢滿足lookup_value表示式的值的物件,並返回其索引值。
countif(range,criteria): 與match類似,不過返回的是命中的數量
因此上面的語句就很容易理解了: 當在單元格中輸入一個值後,會去指定的區域裡面查詢以輸入值開頭的值,查詢命中的起點並且數目,然後再通過OFFSET函式來獲取命中的序列作為下拉的來源。
相關文章
- 閒談團隊的程式碼質量
- 程式碼質量管控 -- 複雜度檢測複雜度
- 範型程式設計雜談程式設計
- 前端程式碼質量-圈複雜度原理和實踐前端複雜度
- 計算機編碼方式雜談計算機
- 雜篇:隨筆程式設計雜談錄–《隆中對》程式設計
- 【雜談】Spring Boot 預設支援的併發量Spring Boot
- Swift雜談Swift
- synchronized雜談synchronized
- IT者雜談
- fragment雜談Fragment
- 函數語言程式設計雜談函數程式設計
- 雜談現代高階程式語言
- 【IT雜談】十年程式設計師程式設計師
- 談談程式碼重構
- 【碼藝雜談】Java中的相同與不同Java
- CesiumJS 原始碼雜談 - 從光到 UniformJS原始碼ORM
- 降低程式碼的圈複雜度——複雜程式碼的解決之道複雜度
- 程式設計雜談——Non-breaking space程式設計
- 隨筆程式設計雜談錄–《隆中對》程式設計
- CodeReview雜談View
- 【雜談】策略模式模式
- 資料雜談
- 雜談 CSS IN JSCSSJS
- 雜談其一
- 免殺雜談
- 數學雜談 #??
- 正則雜談
- 使用工具Source Monitor測量您Java程式碼的環複雜度Java複雜度
- 圈複雜度那些事兒-前端程式碼質量系列文章(二)複雜度前端
- (原)質量管理體系標準雜談--管理的語言
- 談談面試--雜湊表系列面試
- 三年0故障總結,提升程式碼質量的祕訣
- 一些雜感雜想(一)談談加班、團隊
- 談談 Git 程式碼回滾Git
- 【曹工雜談】Maven原始碼除錯工程搭建Maven原始碼除錯
- C++程式設計雜談:物件導向 (轉)C++程式設計物件
- 質量管理體系標準雜談--管理的語言(原創)