はじめに
C#でExcelを操作するライブラリとして「EPPlus」を使っていましたが、Ver5以降有償になった為「ClosedXml」を検討することになりました。
とりあえず、導入と簡単な操作を纏めます。
実用的な手法は随時追加する予定です。
導入
「NuGetパッケージの管理」で「ClosedXML」をインストールします。
コード
usingディレクティブ
using ClosedXML.Excel;
を追加します。
ファイルを開く
// 新規作成
var newbook = new XLWorkbook();
// テンプレートファイルを読み込み
var workbook = new XLWorkbook("帳票テンプレート.xlsx");
// テンプレートファイルをExcelで開いているとエラーになるが、
// ClosedXMLで同じファイルを開いてもエラーにならない
var workbook1 = new XLWorkbook("帳票テンプレート.xlsx");
var workbook2 = new XLWorkbook("帳票テンプレート.xlsx");
シートのコピー
IXLWorksheet templateSheet = workbook.Worksheet("テンプレートシート");
//テンプレートシートを「複製シート」という名前のシートとしてコピー
IXLWorksheet worksheet = templateSheet.CopyTo("複製シート");
シートの削除
templateSheet.Delete();
セル指定(値代入)
worksheet.Cell("C2").Value = "セル指定";
worksheet.Cell(2, 5).Value = "行番号、列番号指定";
worksheet.Cell("セル名").Value = "セル名指定";
行の追加
// 8行目に5行追加
worksheet.Row(8).InsertRowsBelow(5);
コピー
-
行(列)をコピー
書式:維持される
結合:維持されない
高さ(幅):維持されない
※1行(列)ずつしかコピーできない -
範囲をコピー
書式:維持される
結合:維持される
高さ(幅):維持されない
※最大列(行)数を取得して処理すれば行(列)指定と大差ない
という制限があります。
行(列)のコピーは「範囲をコピー+コピー元をもとに高さ(幅)を設定」で対応できます。
//7行目から12行目を13行目から18行目にコピー
// 最大列数を取得
int maxCol = worksheet.LastColumnUsed().ColumnNumber();
//コピー元のセルの指定(7行目1列目~12行目最終列を指定)
IXLRange fromRange = worksheet.Range(7, 1, 12, maxCol);
//コピー先のセルの指定(13行目1列目~18行目最終列を指定)
IXLRange toRange = worksheet.Range(13, 1, 18, maxCol);
//コピーの実施
fromRange.CopyTo(toRange);
// 高さをコピー(13行目~18行目の高さを7行目~12行目を同じにする)
for (int i = 0; i < 6; i++)
worksheet.Row(13 + i).Height = worksheet.Row(7 + i).Height;
//7行目から12行目を19行目から25行目にコピー(結合は解除される)
for (int i = 0; i < 6; i++)
{
worksheet.Row(7 + i).CopyTo(worksheet.Row(19 + i));
worksheet.Row(19 + i).Height = worksheet.Row(7 + i).Height;
}
罫線の追加
// 外枠に線を引く
worksheet.Range(8, 2, 10, 4).Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
// 内側に線を引く
worksheet.Range(8, 2, 10, 4).Style.Border.InsideBorder = XLBorderStyleValues.Thin;
セルの結合
// 8行目の2列目と3列目を結合
worksheet.Range(8, 2, 8, 3).Merge();
ページレイアウト
// 印刷範囲をクリア
worksheet.PageSetup.PrintAreas.Clear();
// 印刷範囲を追加("追加"なので、いったんクリアする必要がある)
worksheet.PageSetup.PrintAreas.Add("B60:D70");
worksheet.PageSetup.PrintAreas.Add(58, 3, 65, 5);
保存
名前を付けて保存
// 名前を付けて保存
workbook.SaveAs("帳票_XXXX.xlsx");
Streamで保存
// Streamで保存 ⇒ byte[]に変換
byte[] ret;
using (MemoryStream ms = new MemoryStream())
{
workbook.SaveAs(ms);
ret = ms.ToArray();
}
関連記事
複数のExcelファイルをzipにしてダウンロード