使用OpenXML访问Excel行中的单元格值 - 对象引用未设置为对象的实例

时间:2012-09-26 16:00:41

标签: c# excel openxml spreadsheet openxml-sdk

我需要从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

1 个答案:

答案 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);
    }
}

使用此结构,可以轻松检测调试器中的问题。您还可以进一步展开此代码并添加更多针对空值的保护,以使您的代码更加健壮。简而言之,您的问题是您对正在阅读的文档的结构做出了无效的假设。作为一般规则,假设是不好的,特别是当他们假设你没有完全控制的输入时。