タツノオトシゴのブログ

主にJavaに関するものです。

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));
            
            
        }
    }