タツノオトシゴのブログ

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

POIの小ネタ - セルの「縮小して全体を表示する」の設定

POI ver3.10から、セルの「縮小して全体を表示」の設定が正式サポートされました。

今まで、「折り返して全体を表示する」は、CellStyle.setWrapText(boolean)でサポートされていたのに不思議です。

メソッドとして、CellStyle.setShrinkToFit(boolean)を使用します。

POI ver.3.9以前にも、実装されていましたが、そのメソッドは公開されていませんでした。

そのため、リフレクションでフィールドの値を取得し、無理矢理変更する方法があります。


【注意事項】
セルの設定の「縮小して全体を表示する」と「折り返して全体を表示する」はどちらか一方のみ有効にできます。
どちらも設定値をtrueにした場合、「折り返して全体を表示する」の設定が優先されるようです。

import org.apache.poi.hssf.record.ExtendedFormatRecord;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
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.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellAlignment;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellAlignment;


    // リフレクションを使い、「縮小して全体を表示する」を設定する。
    public void setShrinkToFit(final Cell cell, boolean shrinkToFit) {
        
        final CellStyle style = cell.getCellStyle();
        
        // POI-3.10以上の場合(正式対応)
//        try {
//            style.setShrinkToFit(shrinkToFit);
//            return;
//        } catch(Exception e) {
//            // POI-3.9以前の場合は、メソッドがないのでエラーが発生
//        }
        
        try {
            //POI-3.10以降(リフレクションで呼ぶ)
            final Method method = style.getClass().getMethod("setShrinkToFit", boolean.class);
            method.setAccessible(true);
            method.invoke(style, shrinkToFit);
            
            cell.setCellStyle(style);
            
            return;
            
        } catch (Exception e) { } 
        
        // POI-3.9以前の場合(リフレクションして呼ぶ)
        if(style instanceof HSSFCellStyle) {
            // POI-3.9以前のExcel2003形式
            try {
                final Field field = style.getClass().getDeclaredField("_format");
                field.setAccessible(true);
                
                ExtendedFormatRecord record = (ExtendedFormatRecord) field.get(style);
                record.setShrinkToFit(shrinkToFit);
                
                cell.setCellStyle(style);
                return;
            } catch (Exception e ) {
                
            }
            
        } else if(style instanceof XSSFCellStyle) {
            // POI-3.9以前のExcel2007形式
            try {
                final Method aligngmentMethod = style.getClass().getDeclaredMethod("getCellAlignment");
                aligngmentMethod.setAccessible(true);
                final XSSFCellAlignment alignment = (XSSFCellAlignment) aligngmentMethod.invoke(style);
                
                final Field alignmentField = alignment.getClass().getDeclaredField("cellAlignement");
                alignmentField.setAccessible(true);
                CTCellAlignment alignment2 = (CTCellAlignment) alignmentField.get(alignment);
                
                alignment2.setShrinkToFit(shrinkToFit);
                
                cell.setCellStyle(style);
                return;
            } catch (Exception e ) {
            }
            
        }
        
    }