我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)
然而,编译
Microsoft.Office.Core.CustomXMLParts myCustomXMLParts =
Microsoft.Office.Interop.Excel.Workbook.CustomXMLParts;
Run Code Online (Sandbox Code Playgroud)
导致错误消息:错误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对象库",可以添加它没有任何错误.它似乎只是参考文献下的"办公室".但是,它似乎对编译器不可见,同时仍然声称Microsoft.Office.Core是在未引用的程序集中定义的,并指定程序集'office',Version = 12.0.0.0.
我的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程序集,或者无论如何都不会正确地公开它们.
是否有一种优雅的方法来检查str.find()
实例方法返回的值-1 ?我发现测试-1值非常难看,但我不想说<0,因为这可能会引起混淆.
if (myString.find('foo') == -1):
print("foo not found in ", myString)
Run Code Online (Sandbox Code Playgroud) 当我不知道它的确切类型时,如何测试类成员是否是列表?然后我如何迭代它呢?
myc是MyClass的一个实例
using System.Reflection;
public class MyClass {
public sometype somename { get; set; }
public List<double> doubles { get; set; }
public List<string> strings { get; set; }
}
foreach(PropertyInfo pi in MyClass.GetProperties()) {
if (pi.GetValue(myc, null) is List<???>){ <--- what should this be?
foreach(object obj in pi.GetValue(myc, null)) { <---- doesn't work
}
var l = pi.GetValue(myc, null) as List<???> <---- doesn't work
}
}
Run Code Online (Sandbox Code Playgroud)