我尝试使用C#将自定义XML添加到打开的Excel 2007工作簿中。我使用Microsoft.Office.Interop.Excel作为接口。我发现那里有一个CustomXMLPart类,但我无法弄清楚如何使用它。 最初我希望代码很简单:
CustomXMLPart myXMLPart = new CustomXMLPart(xmlString);
myWorkBook.XMLCustomParts.Add(myXMLPart);
但这并不接近工作。
我尝试过在线查找示例,但是他们在讨论Packages,Addins,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主互操作程序集(12.0.4518.1014)。
编辑: 我相当确定它是Office DLL的问题所在。在Add-Reference上,我看到" Microsoft Office 12.0对象库"并且可以添加它而没有任何错误。它看起来很简单" Office"在参考文献下。但是,它似乎对编译器不可见,同时仍声称Microsoft.Office.Core是在未引用的程序集中定义的,并指定程序集' office',Version = 12.0.0.0。
My Office引用链接到Microsoft Shared / OFFICE12下的MSO.DLL,并在Properties下有Major Version 2 Minor Version 4。这有关系吗?或者是错误消息只是表明它由于某种原因没有处理这个引用?
编辑:添加COM对象" Microsoft Office 12.0对象库"肯定是问题所在。在其他论坛帖子中,我发现其他人看到的是" Microsoft.Office.Core"出现,但我只看到" Office"。我已经尝试直接编辑.csproj文件,这确实给了一个" Microsoft.Office.Core"但它仍然无法奏效。我唯一可以得出的结论是我的Office 12 Professional Plus MSO.DLL(版本(12.0.6612.1000)实际上并不包含Microsoft.Office.Core程序集,或者无论如何都不会暴露它们正常。
答案 0 :(得分:1)
我认为通过excel自动化完全放弃这种方式会更合适。可能只需通过System.IO.Packaging Namespace
打开excel文件即可。在这里,您可以找到完整的示例:Add Custom XML Parts to Documents Without Starting Microsoft Office
与其他发布的答案相比,此解决方案不需要任何Office PIA的引用。您只需要添加对WindowsBase
的引用,该引用包含在.NET中。它甚至可以处理其他OpenXML文档格式,如docx,pptx ......
答案 1 :(得分:0)
在你的第二个片段中,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;