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

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

CustomXMLPart myXMLPart = new CustomXMLPart(xmlString);

myWorkBook.XMLCustomParts.Add(myXMLPart);

但这并不是接近工作。

我试着在网上find例子,但他们是复杂的谈论包,加载项,OpenXML,VSTOstream等。我已经解压缩一个合适的工作簿(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:无法隐式地将typesMicrosoft.Office.Core.CustomXMLParts转换为Microsoft.Office.Core.CustomXMLParts。

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

编辑:我相当肯定,这是Office DLL的问题。 在添加引用上,我看到“Microsoft Office 12.0对象库”,并可以添加它没有任何错误。 它在参考下显示为“办公室”。 然而,它似乎是不可见的,而仍然声称Microsoft.Office.Core定义在未引用的程序集,并指定程序集“办公室”,版本= 12.0.0.0。

我的Office引用已链接到Microsoft Shared / OFFICE12下的MSO.DLL,并具有属性下的主版本2次版本4。 这很重要吗? 或者是错误信息只是表明它没有处理这个引用的原因?

编辑:添加COM对象“Microsoft Office 12.0对象库”肯定是问题所在。 从其他论坛post我发现其他人看到“Microsoft.Office.Core”的参考出现,但我只看到“办公室”。 我已经尝试直接编辑.csproj文件,并提供“Microsoft.Office.Core”,但它仍然无法正常工作。 唯一的结论,我真的可以做的是,我的MSO.DLL Office 12 Professional Plus(版本(12.0.6612.1000))实际上不包含Microsoft.Office.Core程序集,或者无论如何不会正确公开它们。

MSDN文档给出了一个使用VSTO的例子,我已经适应了这个与Winform应用程序一起工作。

技巧(在这种情况下)是引用PIA, 请参阅下面截图中的Excel Reference的工具提示path 。 注:我没有使用.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

在这里输入图像说明

如果您想从工作簿中获取customXML,请参阅以下答案: https ://stackoverflow.com/a/8488072/495455。


编辑:

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

这是我的项目,请尝试一下,希望你能看到什么从您的解决scheme缺lessvs我的工作: http : //JeremyThompson.Net/Rocks/OfficeExcelCustomXML.zip

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

我认为它会更适合你完全放弃通过Excel自动化的方式。 可能通过System.IO.Packaging Namespace打开Excel文件就足够了。 在这里您可以find一个完整的示例: 将自定义XML部件添加到文档而不启动Microsoft Office

与其他公布的答案相反,此解决scheme不需要任何对Office PIA的引用。 你只需要添加一个对.NET包含的WindowsBase的引用。 它甚至可以处理其他OpenXML文档格式,如docx,pptx …

在你的第二个片段中,Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts是一个types,你不能把它分配给variablesmyCustomXMLParts。 你将不得不有

 Microsoft.Office.Interop.Excel.Workbook myWorkbook = <some appropriate constructor>; ... Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts myParts = myWorkbook.CustomXMLParts;