繁体   English   中英

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

[英]How do I create a new worksheet and populate it with rows of data using 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);

这次没有错误,但是什么也没有发生(尽管我在调试中逐步看到了正在执行的代码)。

您的代码通过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
XlCall.Excel(XlCall.xlcWorkbookInsert, 1);

返回booltrue成功, false失败

因此,将其强制转换为ExcelReference是导致exception的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM