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

C# 如何使用Excel DNA创建新工作表并用数据行填充它?,c#,excel-dna,C#,Excel Dna,我的Excel dna加载项后面有c代码,它正在成功地从服务下载数据。我已经在Excel dna中创建了一个功能区,其中有一个按钮可以触发下载,现在我想在新的工作表中显示数据。如何创建工作表并添加行 我尝试使用以下方法从我的c代码调用: ExcelReference newSheet = (ExcelReference)XlCall.Excel(XlCall.xlcWorkbookInsert, 1); 但我总是得到一个ExcelDna.Integration.XlCallExceptio

我的Excel dna加载项后面有c代码,它正在成功地从服务下载数据。我已经在Excel dna中创建了一个功能区,其中有一个按钮可以触发下载,现在我想在新的工作表中显示数据。如何创建工作表并添加行

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

  ExcelReference newSheet = (ExcelReference)XlCall.Excel(XlCall.xlcWorkbookInsert, 1);
但我总是得到一个ExcelDna.Integration.XlCallException异常。这是正确的方法,还是有更简单的方法

我还尝试将数据的对象[,]粘贴到现有图纸:

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

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

   myTargetPasteArea.SetValue(result);

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

您的代码正在通过C API调用Excel,这就是XlCall.Excel。。。并在作品中提供参考资料。但是不能直接从功能区事件处理程序调用C API。您有两个选择:

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

然后定义一个宏:

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的特定于版本的主互操作程序集,或某些与版本无关的互操作程序集,如。
您的代码正在通过C API调用Excel,这就是XlCall.Excel。。。并在作品中提供参考资料。但是不能直接从功能区事件处理程序调用C API。您有两个选择:

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

然后定义一个宏:

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的特定于版本的主互操作程序集,或某些与版本无关的互操作程序集,如。
在xlcWorkbookInsert之前,您可能需要xlcNew。查看Excel.cs中GetApplication方法的Excel Dna源。

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

XlCall.Excel(XlCall.xlcWorkbookInsert, 1);
返回布尔值:true-成功,false-失败

因此,将其强制转换为ExcelReference是异常的原因

返回布尔值:true-成功,false-失败


因此,将其转换为ExcelReference是异常的原因。

感谢您的快速回答!我认为您发布的ribbon xml代码已经被吃掉了。你能重新发布它吗?啊,我尝试了基于代码的方法,现在我可以创建一个新的工作表,并用我以前的代码编写它。尽管我无法让RunTagMacro属性正常工作,但没关系。谢谢宏方法可以有参数吗?谢谢-我修复了xml。如果您自己调用宏,它可以有参数-也可以将参数添加到InvokeMember调用中。ribbon中的RunTagMacro辅助程序无法满足这一需求。很好,我可以自己称之为RunTagMacro!现在我可以继续制作很棒的东西了,再次感谢你谢谢你的快速回答!我认为您发布的ribbon xml代码已经被吃掉了。你能重新发布它吗?啊,我尝试了基于代码的方法,现在我可以创建一个新的工作表,并用我以前的代码编写它。尽管我无法让RunTagMacro属性正常工作,但没关系。谢谢宏方法可以有参数吗?谢谢-我修复了xml。如果您自己调用宏,它可以有参数-也可以将参数添加到InvokeMember调用中。ribbon中的RunTagMacro辅助程序无法满足这一需求。很好,我可以自己称之为RunTagMacro!现在我可以继续制作很棒的东西了,再次感谢你D