1

我的 Excel-dna 插件后面有 c# 代码,它成功地从服务下载数据。我在 Excel-dna 中创建了一个带有触发下载按钮的功能区,现在我想在新工作表中显示数据。如何创建工作表并添加行?

我尝试使用以下方法从我的 c# 代码中调用xlcWorkbookInsert :

  ExcelReference newSheet = (ExcelReference)XlCall.Excel(XlCall.xlcWorkbookInsert, 1);

但我总是得到一个 ExcelDna.Integration.XlCallException 异常。这是正确的方法,还是有更简单的方法可以做到这一点?

我还尝试将object[,]数据粘贴到现有工作表:

   ExcelReference sheet1 = (ExcelReference)XlCall.Excel(XlCall.xlSheetId, "Sheet1");

   ExcelReference myTargetPasteArea = new ExcelReference(1, 1, 2, 10, sheet1.SheetId);

   myTargetPasteArea.SetValue(result);

这次没有错误,但什么也没有发生(尽管我在调试时可以看到正在执行的代码)。

4

3 回答 3

3

您的代码通过 C API 调用 Excel(这就是Excel-DNA中 XlCall.Excel(...) 和 ExcelReference的工作方式)。但是您不能直接从功能区事件处理程序调用 C API。你有两个选择:

  • 通过宏绕道。如果您更改功能区 xml 代码,这很容易:

    <button onAction="RunTagMacro" tag="MyMacro" />

然后定义一个宏:

public static void MyMacro()
{
    // ... do your work here ....
}

您也可以自己从事件处理程序中调用宏 -RunTagMacro内部只是调用

object app = ExcelDnaUtil.Application;
app.GetType().InvokeMember("Run", BindingFlags.InvokeMethod, 
    null, app, new object[] { control.Tag }, new CultureInfo(1033));
  • 另一种选择是更改您的交互代码以使用 COM API。为此,您需要使用 .NET 4 中的“动态”支持,或引用互操作程序集——Office 的特定于版本的主互操作程序集,或一些与版本无关的互操作程序集,如NetOffice
于 2012-06-27T13:31:52.553 回答
2
XlCall.Excel(XlCall.xlcWorkbookInsert, 1);

返回一个booltrue- 成功,false- 失败

因此,将其转换ExcelReferenceexception.

于 2015-04-20T15:16:53.707 回答
0

在 xlcWorkbookInsert 之前您可能需要一个 xlcNew。查看 Excel.cs 中 GetApplication 方法的 Excel-Dna 源代码。

于 2015-01-18T11:26:15.230 回答