Excelは好きですか?
僕は嫌いです。規則性に乏しい罫線やセル結合にまみれたエクセルを加工するとかうんざりしますね。
…しかしながら最近既存エクセルのプログラムによる修正を強いられましたのでその方法を記録しておきたいと思います🤮
本記事では.NETライブラリのClosedXMLを使ったエクセルの編集方法をまとめています。 NuGetへのインストール手順やエクセルファイルの新規生成については、以前紹介した↓の記事へどうぞ!
- ClosedXMLとは
- 既存のエクセルを加工する
- シート名を変更する
- セルの値を置き換える
- 特定文字列と一致するセルを検索
- 特定文字列と一致するセルの値を置き換える
- 特定文字列と最初に一致したセルの行番号、列番号を取得する
- 特定行に空白行を挿入する
- 特定範囲のセルをコピー&ペーストする
- ワークシート全体を新規ワークシートにコピーする
- シートの拡大率を指定する
- 編集したxlsxを保存する
ClosedXMLとは
エクセルの読込・操作・書き込みの為の.NETライブラリです。 xlsx, xlsmに対応しています。
新規にエクセルファイルを生成したり、既存のものを編集することが可能です。 セルの結合やスタイル編集、セルのデータ型、計算式の指定等をサポートしてくれています。
↓詳細な仕様は公式のGitHubのWikiをご覧ください。
既存のエクセルを加工する
今回は編集時によく使うであろう処理をまとめてみました。
エクセルをロードする
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()
の戻り値のIXLCells
はIEnumerable
を実装していますので、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()
して保存しましょう。