2

アドインのコアとして実行するcsファイルと一緒にExcel用に作成したリボンがあります。CustomRibbonのボタンがクリックされたときに、行の1つのデータ値を解析したいと思います。

    private void button1_Click(object sender, RibbonControlEventArgs e)
    {
        Console.WriteLine(Globals.ThisAddIn.Application.Cells[0, 0]);

    }

しかし、それは私にエラーを与えます

HRESULTからの例外:0x800A03EC

私がやりたいのは、ワークシートのセルからデータを解析し、ワークシートにデータを書き込むことができるようにすることです。私がするときの私のプログラムの起動時でさえ:

        sheet.Cells[0,0]= "hello";

それは私にもエラーを与えます。

4

2 に答える 2

6

Excelシートのセルを参照するための「最も低い」適用可能なインデックスは[1,1]で、これは列A、セル1に対応します。0,0を参照しようとしているようです。テーブル。

C#は通常、ゼロベースのテーブルインデックスを使用しますが、ExcelInteropのプログラマーは別の方法に固執しているようです。それとも、Excelテーブルの最初の行が0ではなく1で始まるため、規則を統一したいと考えていました。私はExcelマニアではありませんが、それが私の推測です。

編集:Siddharthの要求に従って、DataGridViewコントロールの内容をExcelシートにコピーする例を次に示します。これは基本的な機能を示しているだけであり、完全な例または必ずしもベストプラクティスではないことに注意してください。

#using Microsoft.Office.Interop;

Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;

xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add(1);
xlWorkSheet = Excel.Worksheet xlWorkBook.ActiveSheet;

// Notice the index starting at [1,1] (row,column)
for (int i=1; i<DataGridView.Columns.Count+1; i++)
    xlWorkSheet.Cells[1, i] = DataGridView.Columns[i - 1].HeaderText;

for each(DataGridViewRow row in DataGridView.Rows)
{
    for each (DataGridViewColumn column in DataGridView.Columns)
    {
        xlWorkSheet.Cells[row.Index+2,column.Index+1] = DataGridView.Rows[row.Index].Cells[column.Index].Value;
    }
}

インデックス間の不一致に注意してください。この例では、最初にDataGridViewからヘッダーをコピーし、次にExcelシートの位置をオフセットして、残りのデータをコピーします。これは、列ヘッダーがDataGridのインデックス可能なセルとしてカウントされないためです。これはおそらくDataTablesでも機能します。

于 2013-01-15T19:27:51.027 に答える
-1

セルのValue2フィールドを使用してみてください。

sheet.Cells[1,1].Value2 = "hello";

この行にも

Console.WriteLine(Globals.ThisAddIn.Application.Cells[1, 1]);

「セル」フィールドはワークシートのプロパティです。Excelアプリケーションでは使用できません。最初にワークブックを作成または開く必要があり、次に既存のワークシートを作成または使用する必要があります。

編集:Excelの範囲が0インデックスではなく1インデックスであることを忘れました。

于 2013-01-15T18:57:28.577 に答える