はじめに
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を操作することも可能です。