如何在C#中使用OpenXML读取excel的空白单元格列值

这里在我的Execl表单中有一些空白值的列单元格,所以当我使用这段代码的时候,得到错误“Object reference not set to a object of a instance”。

foreach (Row row in rows) { DataRow dataRow = dataTable.NewRow(); for (int i = 0; i < row.Descendants<Cell>().Count(); i++) { dataRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i)); } dataTable.Rows.Add(dataRow); } private static string GetCellValue(SpreadsheetDocument document, Cell cell) { SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart; string value = cell.CellValue.InnerXml; if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) { return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText; } else { return value; } } 

“CellValue”不一定存在。 在你的情况下,它是“空”,所以你有你的错误。 要阅读您的空白单元格:

如果您不想根据单元格包含的内容格式化结果,请尝试

 private static string GetCellValue(Cell cell) { return cell.InnerText; } 

如果你想在返回它的值之前格式化你的单元格

 private static string GetCellValue(SpreadsheetDocument doc, Cell cell) { // if no dataType, return the value of the innerText of the cell if (cell.DataType == null) return cell.InnerText; // depending type of the cell switch (cell.DataType.Value) { // string => search for CellValue case CellValues.String: return cell.CellValue != null ? cell.CellValue.Text : string.Empty; // inlineString => search of InlineString case CellValues.InlineString: return cell.InlineString != null ? cell.InlineString.Text.Text : string.Empty; // sharedString => search for the SharedString case CellValues.SharedString: // is sharedPart exist ? if (doc.WorkbookPart.SharedStringTablePart == null) doc.WorkbookPart.SharedStringTablePart = new SharedStringTablePart(); // is the text exist ? foreach (SharedStringItem item in doc.WorkbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>()) { // the text exist, return it from SharedStringTable if (item.InnerText == cell.InnerText) return cell.InnerText; } // no text in sharedStringTable, create it and return it doc.WorkbookPart.SharedStringTablePart.SharedStringTable.Append(new SharedStringItem(new DocumentFormat.OpenXml.Spreadsheet.Text(cell.InnerText))); doc.WorkbookPart.SharedStringTablePart.SharedStringTable.Save(); return cell.InnerText; // default case : bool / number / date // return the value of the cell in plain text // you can parse types depending your needs default: return cell.InnerText; } } 

两个有用的文件: