3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ClosedXmlをはじめる

Last updated at Posted at 2025-02-04

はじめに

C#でExcelを操作するライブラリとして「EPPlus」を使っていましたが、Ver5以降有償になった為「ClosedXml」を検討することになりました。

とりあえず、導入と簡単な操作を纏めます。
実用的な手法は随時追加する予定です。

導入

「NuGetパッケージの管理」で「ClosedXML」をインストールします。
image.png

コード

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);

印刷範囲を重ねることが出来る
image.png

保存

名前を付けて保存

// 名前を付けて保存
workbook.SaveAs("帳票_XXXX.xlsx");

Streamで保存

// Streamで保存 ⇒ byte[]に変換
byte[] ret;
using (MemoryStream ms = new MemoryStream())
{
    workbook.SaveAs(ms);
    ret = ms.ToArray();
}

関連記事

複数のExcelファイルをzipにしてダウンロード

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?