Help us understand the problem. What is going on with this article?

【C#】Microsoft.Office.Interop.Excelで使える二次元配列を作る

More than 1 year has passed since last update.

はじめに

C#からExcelを操作する時、Microsoft.Office.Interop.Excelを利用すると、ExcelVBAと同じようにでExcelを扱えるのでとても便利です。

一方で、Excelから二次元配列としてデータを一括取得すると、配列の要素番号が1始まりになるなど、VBAと同じであるが故に少々癖が強い部分もあります。

特に、C#側で生成したデータをExcelに二次元配列として貼り付ける時は、配列の要素番号が1からスタートしていないとエラーになってしまうため、以下のような「通常の初期化」で生成した二次元配列を使うとエラーになってしまいます。

// この初期化だと、配列の要素番号が一次元、二次元ともに0からスタートする。
object[,] array2D = new object[100,100];

コード

  • 以下のように「二次元配列の最小要素番号を指定して初期化」することで、任意の要素番号からスタートする二次元配列を生成できます。
    • ここではExcelに貼り付けるための配列なので、要素番号は1からスタートさせています。
/// <summary>
/// 行数と列数を指定して、Excelに貼り付けられる二次元配列を生成する。
/// </summary>
/// <param name="rowIdx">行方向の要素数</param>
/// <param name="colIdx">列方向の要素数</param>
/// <returns>要素番号が1から始まる二次元配列</returns>
public static object[,] CreateArray2D(int rowIdx, int colIdx)
{
    // 二次元配列の各次元の最小要素番号
    int[] lower = { 1, 1 };
    // 二次元配列の各次元の要素数
    int[] length = { rowIdx, colIdx };

    return (object[,])Array.CreateInstance(typeof(object), length, lower);
}

まとめ

  • この方法を知らなくても、1セルずつ書き込めばエラーは起きません。
    • ただし、書き込むセル数が多いと処理速度が劇的に遅くなってしまいます...
  • Microsoft.Office.Interop.Excelを使わずに、POIやNPOI、ClosedXMLなど、別のライブラリを使ってExcelを操作することも可能です。
nkojima
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away