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