我找到了一些如何从Excel电子表格>> HERE <<中读取XML的示例,我试图让代码对我有用。我必须编写一个例程,从工作簿中的15个表中的4个中获取数据,并使用该数据填充我们的数据库。无论如何....
每次尝试查询Excel电子表格时,此代码都会抛出InvalidOperationException
个异常:
static XElement GetWorksheet(string sheetName, PackagePartCollection allParts) {
XElement element = null;
try {
PackagePart worksheetPart = (from part in allParts
where part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName))
select part).Single();
element = XElement.Load(XmlReader.Create(worksheetPart.GetStream()));
} catch (Exception err) { // catches InvalidOperationException
Console.WriteLine(err.Message);
}
return element;
}
具体错误是,“序列不包含元素”
我真的不确定如何调试它,因为我不确定代码试图做什么。
在尝试实现花哨的LINQ表达式之前,有人可以帮助我用标准“C#”编写吗?( LINQ,对吗?)
[解决]
使用JeffN825提供的代码段,我能够创建:
static XElement GetWorksheet(string sheetName, PackagePartCollection allParts) {
string xmlCompare = string.Format("/xl/worksheets/{0}.xml", sheetName);
foreach (PackagePart part in allParts) {
string original = part.Uri.OriginalString;
if (original == xmlCompare) {
XElement element = XElement.Load(XmlReader.Create(part.GetStream()));
return element;
}
}
return null;
}
事实证明,即使我在Excel中的工作表名称是“HV”,“M2”,“CB”和“CC”,我仍然必须将它们指定为“sheet2”,“sheet3”,“sheet4”和“sheet5”。
我必须单步执行161 PackagePart
个对象来查看此内容。
LINQ的效率非常高,以至于在出现问题时很难调试。
答案 0 :(得分:3)
.Single()
正在抛出异常。要么您的查询没有返回任何项目,要么返回&gt; 1项。如果你不确定你期望的项目数量,那么你应该使用FirstOrDefault()
来返回第一场比赛,如果没有找到匹配则为null。
非LINQ等价物是这样的
PackagePart worksheetPart = null
foreach(var part in allParts)
{
if (part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName))))
{
if (part != null) throw new InvalidOperationException(); // > 1 match
worksheetPart = part;
}
}
if (part == null) throw new InvalidOperationException(); // no match
答案 1 :(得分:2)
基本上是这样做的。
PackagePart worksheetPart;
foreach(PackagePart part in allParts)
{
if(part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName)))
{
worksheetPart = part;
break;
}
}
在您的版本中,尝试使用.FirstOrDefault()替换.Single()。
它失败了,因为没有匹配。
答案 2 :(得分:2)
(from part in allParts
where part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName))
select part).Single();
您的错误在Single()
。如果您的查询中没有值,则Single()会抛出该异常。您应该使用的是SingleOrDefault()
,如果查询中没有值,它将返回null
。