【C#エクセル操作】ClosedXML – セル⇔2次元配列の相互変換

当ページのリンクには広告が含まれています。

スポンサーリンク

ClosedXMLを用いて セル⇔2次元配列の相互変換 する方法を解説します

クリックしてジャンプ

準備(usingの記述)

ClosedXMLを使うために書かなければいけない おまじない があります。

using ClosedXML.Excel; // ClosedXMLを使うためのおまじない
using ClosedXML.Excel.Drawings; // ClosedXMLを使うためのおまじない

おまじない を書く場所は プログラムの頭です。

※ NuGet による ClosedXMLライブラリ が追加してあることが前提です。

ライブラリの追加については こちら の記事を参考にしてください。

ClosedXMLライブラリ を追加してない状態で おまじないを書いたらエラーになります。

セルから2次元配列へ読み込み

エクセルから読み出して2次元配列へ読み込むサンプルコードです

読み込む範囲はRangeUsed() メソッドを使って、使用されている範囲を取得しています

using (var wb = new XLWorkbook(@"C:\新しいフォルダー\エクセルブック.xlsx"))
{
    // 使用されている範囲を取得
    var range = wb.Worksheet("sheet1").RangeUsed(); 

    // 2次元配列を定義します。
    var array = new object[range.RowCount(), range.ColumnCount()];

    // Excelの範囲から2次元配列へデータを読み込みます。
    for (int i = 1; i <= range.RowCount(); i++)
    {
        for (int j = 1; j <= range.ColumnCount(); j++)
        {
            array[i - 1, j - 1] = range.Cell(i, j).Value;
        }
    }
    // 'using'ブロックの終わりでworkbookは自動的に閉じられます。保存はされません。
} 

2次元配列からセルへ書き込み

2次元配列をエクセルに書き込むサンプルコードです

.Cell(startCellAddress).CellBelow(i).CellRight(j) は、指定されたスタートセル(startCellAddress)を基点として、そのセルから下に i 右に j 移動した位置にあるセルを参照しています。

具体的には:

  • .Cell(startCellAddress)startCellAddress で指定されたアドレスにあるセルを取得します。例えば "A1" が指定されていれば、A1セルを指します。
  • .CellBelow(i):基点となるセルから下方向に i 行移動したセルを参照します。例えば、基点が A1 で i が 1 なら、A2セルを指します。
  • .CellRight(j):さらに、そのセルから右方向に j 列移動したセルを参照します。例えば、基点が A1 で j が 1 なら、B1セルを指します。
// 2次元配列のデータを準備
var data = new[,] 
{
    { "ヘッダー1", "ヘッダー2" },
    { "データ1", "データ2" }
};

using (var wb = new XLWorkbook(@"C:\新しいフォルダー\エクセルブック.xlsx"))
{
    // 開始セルのアドレスを指定します。ここでは "A1" から始めます。
    var startCell = ws.Cell("A1");

    // 配列のデータをワークシートに書き込みます。
    for (int i = 0; i < data.GetLength(0); i++)
    {
        for (int j = 0; j < data.GetLength(1); j++)
        {
            // 直接 wb.Worksheet("sheet1") を使って値を設定します。
            wb.Worksheet("sheet1").Cell(startCellAddress).CellBelow(i).CellRight(j).Value = data[i, j];
        }
    }

    // ファイルに変更を上書き保存します。
    wb.Save();
}

// 'using' ステートメントの外でwbオブジェクトは自動的に破棄されます。

スポンサーリンク

クリックしてジャンプ