エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

.NETライブラリのClosedXMLで既存のExcelファイルを編集する

Excelは好きですか?
僕は嫌いです。規則性に乏しい罫線やセル結合にまみれたエクセルを加工するとかうんざりしますね。 …しかしながら最近既存エクセルのプログラムによる修正を強いられましたのでその方法を記録しておきたいと思います🤮

f:id:tansantktk:20201118205539p:plain

本記事では.NETライブラリのClosedXMLを使ったエクセルの編集方法をまとめています。 NuGetへのインストール手順やエクセルファイルの新規生成については、以前紹介した↓の記事へどうぞ!

tm-progapp.hatenablog.com

ClosedXMLとは

エクセルの読込・操作・書き込みの為の.NETライブラリです。 xlsx, xlsmに対応しています。

新規にエクセルファイルを生成したり、既存のものを編集することが可能です。 セルの結合やスタイル編集、セルのデータ型、計算式の指定等をサポートしてくれています。

↓詳細な仕様は公式のGitHubのWikiをご覧ください。

github.com

既存のエクセルを加工する

今回は編集時によく使うであろう処理をまとめてみました。

エクセルをロードする

string filePath = "既存のxlsxのパス";
var workbook = new XLWorkbook(filePath);

ロード後は、戻り値のXLWorkbookインスタンスを使って編集していきます。

例えばworkbook.Worksheet(1)で1枚目のシートであるIXLWorksheetインスタンスを参照できます。

各種class, interfaceについて

なお、ClosedXMLではエクセルの情報を下記のclass, interfaceで扱います。

名称 内容
class XLWorkbook エクセルのワークブックの情報を保持
interface IXLWorksheet エクセルのワークシートの情報を保持
interface IXLCell エクセルのセルの情報を保持

シート名を変更する

IXLWorksheet ws = workbook.Worksheet(1);
ws.Name = "新しいシート名";

セルの値を置き換える

IXLWorksheet ws = workbook.Worksheet(1);
ws.Cell(行番号, 列番号).Value = "セルの値";

注意すべきなのは、ClosedXMLでは行番号、列番号は1始まりです。

特定文字列と一致するセルを検索

IXLWorksheet ws = workbook.Worksheet(1);
IXLCells cells = ws.Search("検索したい文字列");

Search()の戻り値のIXLCellsIEnumerableを実装していますので、First()ToList()などのLinqの各種メソッドが使えます。 もし一致するセルが複数あった場合は、一致したセル全てが戻り値に含まれます。

特定文字列と一致するセルの値を置き換える

IXLWorksheet ws = workbook.Worksheet(1);
ws.Search("検索したい値").Value= "置き換えたい値";

もし一致するセルが複数あった場合は、それら全てが置き換えられますので注意です。

特定文字列と最初に一致したセルの行番号、列番号を取得する

IXLWorksheet ws = workbook.Worksheet(1);
int rowNumber = ws.Search("検索したい値").First().Address.RowNumber;
int colNumber = ws.Search("検索したい値").First().Address.ColumnNumber;

LinqのFirst()を使うことで最初に一致したセルを参照しています。

特定行に空白行を挿入する

IXLWorksheet ws = workbook.Worksheet(1);
ws.Row(挿入する行番号).InsertRowsBelow(挿入する行数);

InsertRowsBelow()の引数には挿入する行数をintで指定します。 この処理はエクセルソフト上で行番号を右クリックして挿入した場合と同様の挙動となります。

特定範囲のセルをコピー&ペーストする

IXLWorksheet ws = workbook.Worksheet(1);
// 指定した範囲をコピー
IXLRange range = ws.Range(開始行番号, 開始列番号, 終了行番号, 終了列番号);
// 指定したセルにコピーした範囲をペースト
ws.Cell(貼り付けセルの行番号, 貼り付けセルの列番号).Value = range;

例えば、ws.Range(2, 2, 4, 4)はB2セル~D4セルまでの範囲を指します。

ワークシート全体を新規ワークシートにコピーする

IXLWorksheet ws = workbook.Worksheet(1);
IXLWorksheet newWs = ws.CopyTo("新しいワークシート名");

セルのスタイルや計算式毎コピーしてくれるのが有難いです。

シートの拡大率を指定する

IXLWorksheet ws = workbook.Worksheet(1);
// 拡大率を85%にする
ws.SheetView.ZoomScale = 85;

編集したxlsxを保存する

workbook.SaveAs("保存先のパス");

編集が終わったらSaveAs()して保存しましょう。