c# - 如何使用 C# 将自定义 XML 添加到打开的 Excel 2007 工作簿?

标签 c# xml excel excel-2007 excel-interop

我正在尝试使用 C# 将自定义 XML 添加到打开的 Excel 2007 工作簿。我使用 Microsoft.Office.Interop.Excel 作为界面。我发现有一个 CustomXMLPart 类,但我不知道如何使用它。 最初我希望代码像这样简单:

CustomXMLPart myXMLPart = new CustomXMLPart(xmlString);

myWorkBook.XMLCustomParts.Add(myXMLPart);

但这离工作还很远。

我试过在网上找到示例,但它们在谈论包、插件、OpenXML、VSTO 流等时复杂得令人费解。我解压了一个合适的工作簿 (xlsx),发现它有 docProps/custom.xml 元素。

我只想在保存之前将类似的 custom.xml 添加到新工作簿 (2007)。这可能吗?请注意我不能安装任何额外的包或库。

编辑:我在调查这个问题上取得了一点点进展。我确信我拥有正确的 Office 引用(COM 下的 Microsoft Office 12.0 对象库)和 Excel 互操作引用(GAC 下的 Microsoft.Office.Interop.Excel)。

声明

Microsoft.Office.Core.CustomXMLParts myCustomXMLParts;

编译,但是

Microsoft.Office.Core.CustomXMLParts myCustomXMLParts =
    Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts;

导致错误消息:错误 CS0029:无法将类型“Microsoft.Office.Core.CustomXMLParts”隐式转换为“Microsoft.Office.Core.CustomXMLParts”。

当我将鼠标悬停在 Excel CustomXMLParts 属性上时,它声称返回一个 CustomXMLParts 对象,从某种意义上说,它是一个 Microsoft.Office.Core.CustomXMLParts 对象,但与 Office 程序集中的对象不完全相同。所以这里显然存在一些不兼容性,但我无法解决。我安装了 Microsoft Office Professional Plus 2007 (12.0.6612.1000) 和 Office 2007 Primary Interop Assemblies (12.0.4518.1014)。

编辑: 我相当确定问题出在 Office DLL 上。在添加引用中,我看到“Microsoft Office 12.0 对象库”并且可以毫无错误地添加它。它在“引用”下显示为简单的“Office”。但是它似乎对编译器不可见,同时仍然声称 Microsoft.Office.Core 在未引用的程序集中定义并指定程序集“office”,版本 = 12.0.0.0。

我的 Office 引用链接到 Microsoft Shared/OFFICE12 下的 MSO.DLL,并且在属性下有主要版本 2 次要版本 4。这有关系吗?或者错误消息只是表明由于某种原因它没有处理这个引用?

编辑:添加 COM 对象“Microsoft Office 12.0 对象库”似乎确实是问题所在。从其他论坛帖子中,我发现其他人看到出现“Microsoft.Office.Core”的引用,但我只看到“Office”。我试过直接编辑 .csproj 文件,确实给出了“Microsoft.Office.Core”,但它仍然不起作用。我能真正得出的唯一结论是,我的 Office 12 Professional Plus(版本 (12.0.6612.1000))的 MSO.DLL 实际上不包含 Microsoft.Office.Core 程序集,或者无论如何都没有正确公开它们。

最佳答案

MSDN Docs举一个使用 VSTO 的示例,我已将其改编为与 Winform 应用程序一起使用。

技巧(在这种情况下)是引用 PIA 请参阅下面屏幕截图中 Excel 引用的工具提示路径。注意:我没有使用 .Net 或 COM 引用选项卡,我不得不“浏览”Excel DLL。


下面是使用 Excel PIA(也是版本 12.0.4518.1014)的工作示例的 Winform 代码。有关 Book1.xlsx 重命名为 zip 并在我运行代码后解压缩的更多详细信息的屏幕截图,以及 CustomXML 文件夹中生成的 item1.xml 文件:

private void button1_Click(object sender, EventArgs e)
{
    string path = @"c:\temp\test\Book1.xlsx";
    var xlApp = new Microsoft.Office.Interop.Excel.Application();
    Workbook wb = xlApp.Workbooks.Open(path);

    string xmlString =
    "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
    "<employees xmlns=\"http://schemas.microsoft.com/vsto/samples\">" +
        "<employee>" +
            "<name>Karina Leal</name>" +
            "<hireDate>1999-04-01</hireDate>" +
            "<title>Manager</title>" +
        "</employee>" +
    "</employees>";

    wb.CustomXMLParts.Add(xmlString, Type.Missing);
    wb.Save();
}

截图大图:http://i.stack.imgur.com/O8Qhm.png

enter image description here

如果您想从工作簿中获取自定义 XML,请参阅此答案:https://stackoverflow.com/a/8488072/495455 .


编辑:

我还有从 GAC 引用的 Microsoft.Office.Core ActiveX:C:\Windows\assembly\GAC_MSIL\Office\15.0.0.0__71e9bce111e9429c\Office.dll以及来自 GAC 的 Microsoft VBIDE.Interop C:\Windows\assembly\GAC_MSIL\Microsoft.Vbe.Interop\15.0.0.0__71e9bce111e9429c\Microsoft.Vbe.Interop.dll

这是我的项目,请尝试一下,希望您能看到您的解决方案与我的解决方案相比缺少什么:http://JeremyThompson.Net/Rocks/OfficeExcelCustomXML.zip

请注意 zip 包含 Bin\Debug 文件夹中的 GAC DLL。

关于c# - 如何使用 C# 将自定义 XML 添加到打开的 Excel 2007 工作簿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29903139/

相关文章:

sql - 相当于XQuery中的AS?

来自另一张纸的 VBA 循环

c# - WPF 无法从 MouseDown 事件中获取触摸位置

c# - 陈旧元素引用 : element is not attached to the page document coded UI - C#

c# - 找不到 OAuth2Parameters

java - org.hibernate.boot.registry.classloading.spi.ClassLoadingException:无法加载类[emp.hbm.xml]

c# - 无法启动 Azure 辅助角色,异常代码 0xe0434352 和 0xC0000035

java DOM 在一行中解析 XML

java - 专注于excel中的第一个单元格

excel - Jasper iReport 自定义日期和自定义时间