2014年12月16日火曜日

NPOIで改ページを設定する

.Net Framework用エクセル編集ライブラリのNPOIで改ページをする方法です。

NPOIのバージョンは2.0.6.0、動作確認に使用したExcelは2002です。(ふるっ)

会社ではエクセル出力の要望が多く、NPOIは簡単なエクセルなら
すぐできてしまうのでとても便利です。
//エクセルブックとシートのオブジェクト作成
IWorkbook  book = new HSSFWorkbook();
ISheet sheet = book.CreateSheet("testsheet");
//適当なデータを設定
for (int i = 0; i < 6; i++)
{
 var row = sheet.CreateRow(i);
 for (int j = 0; j < 6; j++)
 {
  var cell = row.CreateCell(j);
  cell.SetCellValue(string.Format("({0},{1})", i + 1,j + 1));
 }
}
using (var fs = new FileStream(@"d:\test.xls", FileMode.OpenOrCreate, FileAccess.Write))
 book.Write(fs);

この時に印刷範囲の指定をしようとしてはまりました。
NPOIにはISheetインタフェースにSetRowBreak、SetColumnBreakというメソッドが
あるのでこれを指定するだけ、と思いましたが期待通りの動作はしてくれません。

//エクセルブックとシートのオブジェクト作成
IWorkbook  book = new HSSFWorkbook();
ISheet sheet = book.CreateSheet("testsheet");
//適当なデータを設定
for (int i = 0; i < 6; i++)
{
 var row = sheet.CreateRow(i);
 for (int j = 0; j < 6; j++)
 {
  var cell = row.CreateCell(j);
  cell.SetCellValue(string.Format("({0},{1})", i + 1,j + 1));
 }
}

sheet.SetRowBreak(2); //追加
sheet.SetColumnBreak(2); //追加

using (var fs = new FileStream(@"d:\test.xls", FileMode.OpenOrCreate, FileAccess.Write))
 book.Write(fs);
※エクセルの3列目と3行目に改ページを行う設定を追加



対処方法ですが、SheetオブジェクトのFitToPageプロパティをFalseに設定すれば
思ったとおりの動作をしてくれます。

//エクセルブックとシートのオブジェクト作成
IWorkbook  book = new HSSFWorkbook();
ISheet sheet = book.CreateSheet("testsheet");
//適当なデータを設定
for (int i = 0; i < 6; i++)
{
 var row = sheet.CreateRow(i);
 for (int j = 0; j < 6; j++)
 {
  var cell = row.CreateCell(j);
  cell.SetCellValue(string.Format("({0},{1})", i + 1,j + 1));
 }
}

sheet.SetRowBreak(2);
sheet.SetColumnBreak(2);
sheet.FitToPage = false; //追加
using (var fs = new FileStream(@"d:\test.xls", FileMode.OpenOrCreate, FileAccess.Write))
 book.Write(fs);



FitToPageはシートを1ページに収まるように自動で調整するプロパティでデフォルトでTrueになっているため、SetRowBreak,SetColumnBreakを設定してもこちらが優先されてしまうようです。

0 件のコメント:

コメントを投稿