我可以通过剪贴板将[Serializable]对象传递给Excel AddIn吗?

时间:2014-12-01 19:44:26

标签: c# wpf excel vsto

我有2个应用程序:一个基于WPF DataGrid,另一个是Excel AddIn。

我的目标是通过剪贴板将数据从前者传递到后者。

将制表符分隔的cuadriculated数据复制到常规Excel“粘贴”操作中没有问题。另外,我实现了自己的“智能粘贴”。

当我决定复制+粘贴更复杂的对象时,我的麻烦就开始了。我将所有类标记为[Serializable]并且有一个方法可以确保对象可以序列化。事实上,只要粘贴应用程序不是Excel AddIn,整个操作就可以完美运行。

传递的对象是名为Engineering.Export.Exported的类。我们可以看到,剪贴板看起来很好:

http://patriot.net/~ramon/misc/Copy-is-Okay.png

参见3个相关陈述。它们在两种应用中都是相同的。

http://patriot.net/~ramon/misc/Failed-Assignment.png

最后一次分配仅在我需要它的应用程序中失败。

我尝试了很多组合,例如GetData(“ExportFormat”),但结果是一样的。

非常欢迎任何提示,建议。

TIA

增加:

我准备了一个超级简单的对象:

namespace Engineering
{
    [Serializable]
    public class SimpleStuff
    {
        public string Greetings;
        public int GraduationYear;
        public bool Available;
    }
}

问题仍然存在:我可以将其导出到任何应用程序,除了一个VSTO AddIn。最后一个语句总是在AddIns中返回null。

2 个答案:

答案 0 :(得分:1)

如果您擅长调试,可以“测试”类型:

private void pasteButton_Click(object sender, RoutedEventArgs e)
{
    var dataObject = Clipboard.GetDataObject();
    if (dataObject != null) {
        Exported incomingObject;
        if (dataObject.GetDataPresent(typeof(Exported))) {
            incomingObject = dataObject.GetData(typeof(Exported));
        } else {
            var obj = dataObject.GetData(typeof(Object));
            incomingObject = obj as Exported;
        }
        if (incomingObject != null) {
          // what you want to do with it can go here
        }
    }
}

Console.WriteLine上放置一个断点,看看dataType变量是什么。

当然,请确保您只测试您感兴趣的数据类型。

让我知道这是怎么回事。

答案 1 :(得分:0)

使用非AddIn应用程序运行一些实验后,我发现了问题。而不是返回null,有问题的语句失败,并显示有关缺少程序集的错误消息。

解决方案是在所涉及的两个应用程序中创建一个单独的MSVS项目,该项目仅包含要传输的对象,编译它并添加对它的引用。

感谢Eric J.