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

如何使用C#将自定义XML添加到打开的Excel 2007工作簿?,c#,xml,excel,excel-2007,excel-interop,C#,Xml,Excel,Excel 2007,Excel Interop,我正在尝试使用C#将自定义XML添加到打开的Excel 2007工作簿中。我正在使用Microsoft.Office.Interop.Excel作为界面。我发现有一个CustomXMLPart类,但我不知道如何使用它。 最初,我希望代码是简单的,如: CustomXMLPart myXMLPart=新的CustomXMLPart(xmlString) myWorkBook.XMLCustomParts.Add(myXMLPart) 但这还远远不够 我曾尝试在网上查找示例,但它们在讨论包、加载项、

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

CustomXMLPart myXMLPart=新的CustomXMLPart(xmlString)

myWorkBook.XMLCustomParts.Add(myXMLPart)

但这还远远不够

我曾尝试在网上查找示例,但它们在讨论包、加载项、OpenXML、VSTO流等时复杂得令人困惑。我解压缩了一个合适的工作簿(xlsx),发现它有docProps/custom.xml元素

我只想在保存新工作簿(2007)之前将类似的custom.xml添加到新工作簿中。这可能吗?请注意,我无法安装任何其他软件包或库

编辑:我在调查这个问题上取得了一些进展。我确信我有正确的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主互操作程序集(12.0.4518.1014)

编辑: 我相当肯定的是,这是办公室DLL的问题。在添加引用时,我看到“MicrosoftOffice12.0对象库”,可以添加它而不会出现任何错误。它在引用项下显示为“Office”。但是,它似乎对编译器不可见,但仍声称Microsoft.Office.Core是在未引用的程序集中定义的,并指定程序集“Office”,版本=12.0.0.0

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


编辑:添加COM对象“MicrosoftOffice12.0对象库”显然是个问题。从其他论坛帖子中,我发现其他人看到了“Microsoft.Office.Core”的引用,但我只看到了“Office”。我尝试过直接编辑.csproj文件,这确实给出了一个“Microsoft.Office.Core”,但仍然不起作用。我唯一能得出的结论是,我的Office12ProfessionalPlus(12.0.6612.1000版)的MSO.DLL实际上不包含Microsoft.Office.Core程序集,或者至少没有正确公开它们。

在第二个代码段中,Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts是一个类型,您不能将其分配给变量myCustomXMLParts。您必须

Microsoft.Office.Interop.Excel.Workbook myWorkbook = <some appropriate constructor>;
...
Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts myParts = myWorkbook.CustomXMLParts;
Microsoft.Office.Interop.Excel.Workbook myWorkbook=;
...
Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts myParts=myWorkbook.CustomXMLParts;
本文给出了一个使用VSTO的示例,我已将其改编为使用Winform应用程序

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


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

private void按钮1\u单击(对象发送者,事件参数e)
{
字符串路径=@“c:\temp\test\Book1.xlsx”;
var xlApp=new Microsoft.Office.Interop.Excel.Application();
工作簿wb=xlApp.Workbooks.Open(路径);
字符串xmlString=
"" +
"" +
"" +
“卡丽娜·莱尔”+
"1999-04-01" +
“经理”+
"" +
"";
wb.CustomXMLParts.Add(xmlString,Type.Missing);
wb.Save();
}
屏幕截图的大视图:

如果要从工作簿获取customXML,请参阅以下答案:


编辑:

我还从GAC中引用了Microsoft.Office.Core ActiveX:
C:\Windows\assembly\GAC\U MSIL\Office\15.0.0.0\Uu71E9BCE111E9429C\Office.dll
和GAC中的Microsoft VBIDE.Interop以及
C:\Windows\assembly\GAC\U MSIL\Microsoft.Vbe.Interop\15.0.0.0\Uu71E9BCE111E9429C\Microsoft.Vbe.Interop.dll

这是我的项目,请尝试一下,希望您能看到您的解决方案与我的有效解决方案之间缺少什么:


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

我认为通过excel automation完全放弃这种方式更合适。可能通过
System.IO.Packaging Namespace
打开excel文件就足够了。在这里,您可以找到完整的示例:


与其他已发布的答案不同,此解决方案不需要任何对Office PIA的引用。您只需添加对.NET中包含的WindowsBase的引用即可。它甚至可以处理其他OpenXML文档格式,如docx、pptx…

不幸的是,它不是一种类型,而是一种属性。其返回类型是Microsoft.Office、 Core.XMLParts-在Office MSO.DLL中找不到的类型。@TheMatheMagictor这是一种类型!您似乎感到困惑,因为
Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts
。简单地说,要使用该属性,您需要实例化
W的对象
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();
}