使用openXML从excel导入时出现exception

我想反序列化从excel文件列出的所有数据。

我正在使用这个代码

class ExcelImport { Workbook workBook; SharedStringTable sharedStrings; IEnumerable<Sheet> workSheets; WorksheetPart custSheet; WorksheetPart orderSheet; string FilePath; ExcelStorage provider; Stiker[] ans; List<Stiker> StikerList; public ExcelImport(string fp) { FilePath = fp; } public List<Stiker> dothejob() { using (SpreadsheetDocument document = SpreadsheetDocument.Open(FilePath, true)) { StikerList= new List<Stiker>(); workBook = document.WorkbookPart.Workbook; workSheets = workBook.Descendants<Sheet>(); sharedStrings = document.WorkbookPart.SharedStringTablePart.SharedStringTable; StikerList = Stiker.LoadStiker(custSheet.Worksheet, sharedStrings); return StikerList; } } 

但从一些共鸣我得到的exception行: sharedStrings = document.WorkbookPart.SharedStringTablePart.SharedStringTable;

那“对象引用没有设置为对象的一个​​实例”。

上述的下陷发现后

 if (sharedStringTablePart == null) { // report a problem } 

重新返回null

任何想法?

源代码行中的一个属性将为“null”,并且没有任何价值。

你会想要使用一个debugging器来解决这个问题(在行上设置一个断点,并将鼠标hover在每个属性上),或者将行分解为单独的语句。 就像是:

 var workBookPart = document.WorkbookPart; if (workBookPart == null) { // do something to report a problem } var sharedStringTablePart = workBookPart.SharedStringTablePart; if (sharedStringTablePart == null) { // report a problem } sharedStrings = sharedStringTablePart.SharedStringTable; 

这样,你的代码可以在运行时确定是否存在问题:这种“防御”的想法通常是处理由某个系统创build的数据的好主意。

经过半天parsing2007年,2010年,2013年,并转换一些2003年>> 2007年和parsing它们,我有一种parsingexcel发射SharedStringTable在某些情况下

  var link = document.WorkbookPart.SharedStringTablePart; Func<Cell, string> selector = (cell) => cell.InnerText; if (link != null) { SharedStringTable sharedStringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable; selector = (cell) => cell.DataType == null ? cell.InnerText : cell.DataType == CellValues.SharedString ? sharedStringTable.ElementAt(Int32.Parse(cell.InnerText)).InnerText : cell.InnerText; } var values = wsPart.Worksheet.Descendants<Cell>().Select(cell =>selector(cell) ).ToArray();