2024年10月4日金曜日

NPOI ~ブック全体のフォント設定~

NPOI


C#プログラムからEXCELファイルに出力する場合、以前は、ActivatorでEXCELのインスタンスを作る、いわゆるOLEオートメーション(懐かしい...)の方法を採っていた。もっと昔のC++の時代にも、同じOLEとしてオブジェクトを作成する方法だった。

この方法の良いところは、ライブラリなどを参照する必要がないことと、EXCELアプリケーションが持つOLE用のIFに直接アクセスすることで、確実に処理を完了することができることである。

しかし、以下のような悪い点もある。

  • EXCELがインストールされていないと動かない。(サーバー上のバッチ処理でEXCELファイルを作成するようなことが出来ない。)
  • 重い。遅い。
  • 他にEXCELが開いていると、コピー操作で干渉してしまい、たまに落ちることがある。
  • C#なら、try ~ finally でインスタンスを確実にkillしないと、Windowsが不安定になる。

この悪い点が、良い点を上回っているので、仕方なく使っていた感があった。
(他に、以前Microsoftが作って、後に放棄した、Office SDKみたいな(名前忘れた...)ものもあったが、基本的には上記OLEと変わらず、ライブラリ化しただけだ。)

だがNPOIが登場してから状況が一変した。(Apache POIの存在は知っていたが、WindowsデスクトップアプリでJava?と敬遠していた。)
他にも似たようなライブラリがいくつかあるが、毛の抜けたSEは断然NPOIを推す。

前置きが長くなったが、ここから本題に入る。

ブック全体のフォント設定


NPOIの情報は検索すればたくさん出てくるので基本操作は割愛する。
そのたくさんある情報の中で、ブック全体の書式設定、特にブック全体のフォントの設定はなかなか見つからなかったので投稿しておく。

// ブックの作成
var book = new XSSFWorkbook();
// 既定のフォントを取得
var font = book.GetFontAt(0);
// フォントサイズ
font.FontHeightInPoints = 8;
// フォント名
font.FontName = "メイリオ";
// フォントファミリーの設定(これがミソ)
((XSSFFont)font).SetFamily(FontFamily.MODERN);
((XSSFFont)font).SetScheme(FontScheme.NONE);
// フォント字体(設定しないなら書かなくてもよい)
font.IsItalic = false;
font.IsBold = false;

// 既定の書式設定を取得(おまけ。不要なら書かなくてもよい)
var style = book.GetCellStyleAt(0);
style.VerticalAlignment = VerticalAlignment.Center;
style.WrapText = false;

// シートの作成(ブックを作成したら、最低1つはシートを作成する)
var sheet = book.CreateSheet();

// ブックの保存
using (var fs = new FileStream(filePath, FileMode.Create))
{
    book.Write(fs);
}

フォントファミリーを設定するのがミソっぽく、フォントスキームもセットで。
試しに、上記コードからミソの2行をコメントアウトして実行すると、フォントサイズや字体などは設定通りになっているが、フォントは変わっていないはず。
(ちなみに欧文フォントにしても変わらなかった。)

ここで作成されるEXCELファイルは、エクスプローラーの右クリックから、新規作成→Microsoft Excel ワークシート と選択したときと同じ、以下のファイルをベースに作成される。
C:\Program Files\Microsoft Office\root\vfs\Windows\SHELLNEW\EXCEL12.XLSX
デフォルトではこのファイルのフォントは「游ゴシック」になっている。

上記コードで作成したファイルは、後からシートを追加しても、フォントは設定したフォントになっているはずだ。

0 件のコメント:

コメントを投稿