从Excel API C#获取单元格值

Ram*_*mie 1 c# api excel vba excel-vba

我有一个我为Excel制作的功能区以及一个cs文件作为加载项的核心.在CustomRibbon上单击按钮时,我想解析其中一行的数据值.

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

    }
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误

来自HRESULT的异常:0x800A03EC

我想要做的就是能够解析工作表上的单元格中的数据并将数据写入工作表.即使在我的程序启动时,我也这样做:

        sheet.Cells[0,0]= "hello";
Run Code Online (Sandbox Code Playgroud)

它也给我一个错误.

B L*_*B L 5

用于引用Excel工作表中单元格的"最低"适用索引是[1,1],它对应于列A,单元格1.我看到你试图引用0,0这超出了界限桌子.

虽然C#通常使用基于零的表索引,但似乎Excel Interop的程序员遵循不同的方法.那或他们想保持他们的约定统一,因为Excel表格中的第一行以1开头,而不是0.我不是Excel buff,但这是我最好的猜测.

编辑:Per 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意索引之间的差异.此示例首先从DataGridView复制标头,然后抵消Excel工作表中的位置以复制其余数据,因为列标题不计入DataGrid中的可索引单元格.这可能也适用于DataTables.