5

C#を使用してExcelワークシートに大きな2D配列を書きたいと思っています。配列が500x500の場合、これを作成するために使用するコードは次のとおりです。

 var startCell = Worksheet.Cells[1, 1];
 var endCell = Worksheet.Cells[500, 500];
 var writeRange = (Excel.Range)Worksheet.Cells[startCell, endCell;
 writeRange.Value = myArray;

この行で例外が発生します:

var endCell = Worksheet.Cells[500, 500];

COM経由でC#とExcelを使用したことがある人なら誰でも証言できるように、受け取ったエラーメッセージはほとんど役に立ちません。問題は、ワークシートに使用されている基になるデータ構造が、最初にシートを作成したときにセル500,500にインデックスを付けるのに十分なサイズではないことだと思います。

誰かが望ましい結果を達成する方法を知っていますか?範囲を作成する前に、基になるデータ構造のサイズを変更する簡単な方法があることを期待しています。

ありがとう。

編集:エラーメッセージは次のとおりです。

{"Exception from HRESULT: 0x800A03EC"}

-2146827284のエラーコードで優れています。

更新:以下のコメントで提供されているリンクは、互換モードでExcelシートを開く際の問題を示唆しています。これが問題のようです。コードを実行する前にドキュメントを.xlsxまたは.xlsm形式で保存すると、これは機能するようです。私の問題は、ユーザーが毎回これを行うことを期待できないことです。これを達成するためのプログラム的な方法はありますか?ファイルを開いて拡張子を確認し、必要に応じて新しい形式で保存するだけの場合でしょうか。

4

2 に答える 2

4

解決策を見つけました。

Worksheet.Cells [x、x]を使用する代わりに、代わりにWorksheet.get_range(x、x)を使用してください。

于 2012-08-29T10:27:10.180 に答える
1

私はちょうど私のために働いた小さな例を書きました。もともとSOでこの答えが見つかりました。私の相互運用機能アセンブリ(Excel 14オブジェクトライブラリ)のように、この答えを適応させる必要がありました。これ以上の方法はありません。 Worksheet.get_Range(.., ..)

var startCell = ws.Cells[1, 1];
int row = 500, col = 500;
var endCell = ws.Cells[row, col];
try
{
    // access range by Property and cells indicating start and end           
    var writeRange = ws.Range[startCell, endCell];
    writeRange.Value = myArray;
}
catch (COMException ex)
{
    Debug.WriteLine(ex.Message);
    Debugger.Break();
}
于 2012-08-29T09:19:26.423 に答える