日々常々

ふつうのプログラマがあたりまえにしたいこと。

POIを使ってみる/横幅の設定

横道に逸れてセルというか行の横幅について。POIのバージョンは3.6です。

横幅はSheetに設定され、横幅は Sheet#getColumnWidth で取得できます。問題となるのは、この際に取得できる値が何なのかという点。JavaDocには以下のように書かれているので、取得できる値は【文字数*256】という事になります。

getColumnWidth
int getColumnWidth(int columnIndex)
get the width (in units of 1/256th of a character width )

Sheet (POI API Documentation)

また、デフォルトの横幅は Sheet#getDefaultColumnWidth で取得できます。こちらは単純に文字数のようです。

getDefaultColumnWidth
int getDefaultColumnWidth()
Get the default column width for the sheet (if the columns do not define their own width) in characters

Sheet (POI API Documentation)

試しにMicrosoftExcel2003で作成したデフォルトのファイルを読み込んで取得してみると、デフォルト8、1列目の横幅は2048になりました。次に、OpenOffice.org Calcで作成したファイルだと、デフォルト12、1列目の横幅は3290になりました。最後にnew HSSFWorkbook() で作成した場合、デフォルト8、1列目の横幅は2048になりました。どれも Sheet#getDefaultColumnWidth * 256 になってい…ないじゃん。どういう事?と思ったけど、これは単純にデフォルト値がint型と言うだけ、だと思う。とりあえず気にしないで進めるとします。

さて横幅の取得方法がわかったところで設定方法に移ります。使用するメソッドは想像通り Sheet#setColumnWidth です。今回はJavaDocの日という訳で、こちらも一応。

setColumnWidth
void setColumnWidth(int columnIndex, int width)
Set the width (in units of 1/256th of a character width)
The maximum column width for an individual cell is 255 characters. This value represents the number of characters that can be displayed in a cell that is formatted with the standard font.

Sheet (POI API Documentation)

設定値は Sheet#getColumnWidth で取得できる値と同じく、1文字の1/256が単位になります。数値はピクセルでもセンチメートルでもないので気をつけてください。ですので、そういった単位で指定された場合はすごく手間です。 Sheet#setColumnWidth で設定する値は、あくまで1文字を基準としたサイズですので、文字の大きさが変われば、同じ数値でも異なる幅になってしまったりします。
この辺りは、同じWorkbookを扱っている限りは同じFontを基準にするようなのであまり問題にはならないと思うのですが、Workbookをまたがる複製を行う際には大きくずれてしまうこともありますので、注意が必要になります。なお、この際に基準となるのは Workbook.getFontAt((short)0) で取得できるFontのようです。列幅の調整時には、Fontも同時に相手しないといけないと言うことです。