POIの小ネタ - セルの入力規則の取得
現在、開発中のPOI ver3.11から、セルの入力規則の取得ができるようになりました。
今まで、入力規則の設定はできていましたが、取得はできませんでした。
取得するには、メソッドとして、Sheet.getDataValidations()を使用します。
取得できることにより、行を追加したときなど、既存の行の入力規則を変更することができるようになります。
【注意事項】
POI-3.11beta3で試しましたが、既存の入力規則の範囲を変更するには、新たに入力規則用のインスタンスであるDataValitaionを再作成し、再追加する必要があるようです。
入力範囲を書き換えるには、現状メソッドがないため、リフレクションなどを利用して無理矢理変更します。
詳細は、POIの小ネタ - セルの入力規則の修正 - タツノオトシゴの日記を参照。
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DataValidation; import org.apache.poi.ss.usermodel.DataValidationConstraint; import org.apache.poi.ss.usermodel.DataValidationHelper; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; public void fixValidationRule(final Cell cell) { // 行を1つ挿入する Sheet sheet = cell.getSheet(); int lastRow = sheet.getLastRowNum(); if(lastRow == cell.getRowIndex()) { lastRow++; } sheet.shiftRows(cell.getRowIndex()+1, lastRow, 1); DataValidationHelper helper = sheet.getDataValidationHelper(); // 入力規則の範囲を修正する List<? extends DataValidation> list = sheet.getDataValidations(); for(DataValidation validation : list) { // 自身のセルの入力規則を探し出す CellRangeAddressList region = validation.getRegions(); for(CellRangeAddress range : region.getCellRangeAddresses()) { if(range.isInRange(lastRow-1, cell.getColumnIndex())) { // 追加した行に対して入力規則の設定範囲を広げる(新たに領域を追加する) range.setLastRow(lastRow); break; } } // 規則を作り直して、再度シートに追加する // ※再追加すると既存の範囲が残ったままになるため、実際は、下記URLを参照。 // http://d.hatena.ne.jp/tatsu-no-toshigo/20150612/1434131054 sheet.addValidationData(helper.createValidation(validation.getValidationConstraint(), region)); } }