我需要从Excel电子表格中读取值并将值保存到数据库中。我此时似乎遇到的问题是访问我的行对象
列中的各个值http://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.cellvalue.aspx
var cellValues = from cell in row.Descendants<Cell>()
select (cell.DataType != null && cell.DataType.HasValue && cell.DataType == CellValues.SharedString
&& int.Parse(cell.CellValue.InnerText) < sharedString.ChildElements.Count
? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
: cell.CellValue.InnerText);
不幸的是,上面的代码似乎没有完成这项工作,因为它在运行时抛出异常,因此寻找有关如何使用OpenXML访问Excel Row对象中包含的值的最佳想法。
+ $ exception {“对象引用未设置为对象的实例。”} System.Exception {System.NullReferenceException}
结果StackTrace
at MOC.Import.Products.<ProcessRows>b__0(Cell cell) in c:\Development\CFrontEnd\MOC.Import\Products.cs:line 37
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
at MOC.Import.Products.ProcessRows(IEnumerable`1 dataRows, SharedStringTable sharedString) in c:\Development\CFrontEnd\MOC.Import\Products.cs:line 45
答案 0 :(得分:1)
您引用的其中一个对象为null。找到导致问题的特定对象的最简单方法是从LINQ表达式中取出过滤和格式化代码,然后遍历单元格:
var cellValues = from cell in row.Descendants<Cell>()
select cell;
foreach (var cell in cellValues)
{
if(cell.DataType != null
&& cell.DataType.HasValue
&& cell.DataType == CellValues.SharedString
&& int.Parse(cell.CellValue.InnerText) < sharedString.ChildElements.Count)
{
DoSomething(sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText);
}
else
{
DoSomething(cell.CellValue.InnerText);
}
}
使用此结构,可以轻松检测调试器中的问题。您还可以进一步展开此代码并添加更多针对空值的保护,以使您的代码更加健壮。简而言之,您的问题是您对正在阅读的文档的结构做出了无效的假设。作为一般规则,假设是不好的,特别是当他们假设你没有完全控制的输入时。