如何使用Excel-DNA创建新工作表并使用数据行填充它?

时间:2012-06-27 09:58:56

标签: c# excel-dna

我的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);

这次没有错误,但没有任何反应(尽管我在调试时可以看到正在执行的代码)。

3 个答案:

答案 0 :(得分: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。 / LI>

答案 1 :(得分:2)

XlCall.Excel(XlCall.xlcWorkbookInsert, 1);

返回booltrue - 成功,false - 失败

因此将其转换为ExcelReferenceexception

的原因

答案 2 :(得分:0)

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