3

我有一个问题,我想使用按钮单击方法插入数据,但此方法是在功能区菜单 (VSTO) 中创建的。

为了更好地理解这一点,我想对数据库进行查询,将其发送到人员列表,并在 excel 上打印我想从这些人那里看到的内容。例如,我只想查看姓名和出生日期,或姓名、身份证和职业。

为此,我需要选择运行应用程序时打开的工作簿。所以我试试这个:

private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            Excel.Workbook wb = (Excel.Workbook)Globals.ThisWorkbook.InnerObject;
            Excel.Worksheet ws = wb.Sheets["Sheet1"];
            ws.Cells[1, 2] = "teste";
        }
  • 使用 Excel = Microsoft.Office.Tools.Excel;
  • 使用 ExcelTools = Microsoft.Office.Tools;
  • 使用 Microsoft.Office.Interop.Excel;

但我得到这个错误: **"Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Tools.Excel.Workbook'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{B74CBB86-9C9F-4172-9AE7-3CE4A7BFA5EB}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."**

可能比我看到的更容易,但我太累了,我需要完成这个......

4

2 回答 2

4

男人试试这个:

using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Tools.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
Excel.Worksheet wsheet =
  (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet;
于 2012-10-19T16:11:25.673 回答
3

以下应该有效(删除.InnerObject)

private void button1_Click(object sender, RibbonControlEventArgs e) 
        { 
            Excel.Workbook wb = (Excel.Workbook)Globals.ThisWorkbook; 
            Excel.Worksheet ws = wb.Sheets["Sheet1"]; 
            ws.Cells[1, 2] = "teste"; 
        } 

InnerObject属性返回对基础(读取 COM)工作簿的引用。返回类型是 Microsoft.Office.Interop.Excel.Workbook(而不是 Microsoft.Office.Tools.Excel.Workbook,它是工作簿的 .Net 包装版本)

这同样适用于工作表:
如果您访问本机 Com 工作簿的 Sheets 集合,它将返回 Microsoft.Office.Interop.Excel.WorkSheet,访问 Excel.Workbook 将返回 Excel.WorkSheet

有关 vsto 包装对象的更多信息,请参见:this

于 2012-10-16T11:43:17.530 回答