繁体   English   中英

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

[英]How do I add a custom XML to an open Excel 2007 workbook using C#?

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

CustomXMLPart myXMLPart =新的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主互操作程序集(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文档提供了一个使用VSTO的示例,我已经对其进行了修改以使其与Winform应用程序一起使用。

技巧(在这种情况下)是引用PIA, 请参见下面的屏幕快照中的Excel Reference的工具提示路径 注意:我没有使用.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.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

请注意,该压缩文件在Bin \\ Debug文件夹中包含GAC DLL。

我认为通过excel自动化完全放弃该方式将更加适合您。 通过System.IO.Packaging Namespace打开excel文件可能就足够了。 在这里您可以找到完整的示例: 在不启动Microsoft Office的情况下将自定义XML部件添加到文档中

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

在第二个片段中,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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM