试图读取与epplus的Excel文件,并获取System.NullException错误?

编辑

根据下面的回复,我遇到的错误可能会或可能不会导致我无法阅读我的Excel文件。 也就是说,我没有从行worksheet.Cells[row,col].Value获取数据worksheet.Cells[row,col].Value在下面给出的for循环中。

问题

我想从Excel文件返回一个DataTable的信息。 具体来说,这是一个从2013年Excel我相信xlsx文件。 请参阅下面的代码:

 private DataTable ImportToDataTable(string Path) { DataTable dt = new DataTable(); FileInfo fi = new FileInfo(Path); if(!fi.Exists) { throw new Exception("File " + Path + " Does not exist."); } using (ExcelPackage xlPackage = new ExcelPackage(fi)) { //Get the worksheet in the workbook ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets.First(); //Obtain the worksheet size ExcelCellAddress startCell = worksheet.Dimension.Start; ExcelCellAddress endCell = worksheet.Dimension.End; //Create the data column for(int col = startCell.Column; col <= endCell.Column; col++) { dt.Columns.Add(col.ToString()); } for(int row = startCell.Row; row <= endCell.Row; row++) { DataRow dr = dt.NewRow(); //Create a row int i = 0; for(int col = startCell.Column; col <= endCell.Column; col++) { dr[i++] = worksheet.Cells[row, col].Value.ToString(); } dt.Rows.Add(dr); } } return dt; } 

错误

这是奇怪的地方。 我可以在startCellendCell看到适当的值。 但是,当我看着worksheet时,我在“ Cells下查看了一些内容,发现了一些我不明白的地方:

 worksheet.Cells.Current' threw an exception of type 'System.NullReferenceException 

尝试

  • 重新格式化我的excel与一般的领域。
  • 确保我的Excel中没有字段是空的
  • RTFM的epplus文件。 没有提示这个错误。
  • 看着在计算器上的EPPlus错误。 我的问题是独特的。

老实说,我很难搞清楚这个错误是在说什么? 我的格式有问题吗? epplus有问题吗? 我已经读过这里人们有与eeplus 2013 xlsx没有问题,我只是试图按行parsingexcel文件。 如果有人能帮我弄清楚这个错误的含义以及如何纠正错误。 我将非常感激。 我花了很长时间试图弄清楚这一点。

就像@Thorians所说的那样,当你枚举单元格的时候,当前的确是要用到的。 如果你想以最纯粹的forms使用它,并且实际上可以调用current那么你需要这样的东西:

 using (var pck = new ExcelPackage(existingFile)) { var worksheet = pck.Workbook.Worksheets.First(); //this is important to hold onto the range reference var cells = worksheet.Cells; //this is important to start the cellEnum object (the Enumerator) cells.Reset(); //Can now loop the enumerator while (cells.MoveNext()) { //Current can now be used thanks to MoveNext Console.WriteLine("Cell [{0}, {1}] = {2}" , cells.Current.Start.Row , cells.Current.Start.Column , cells.Current.Value); } } 

请注意,您必须创build一种local收集cells才能正常工作。 否则,如果您尝试使用`worksheet.cells.current',则Current将为null

但是使用ForEach会更简单,让CLR为您做好工作。


更新:基于评论。 你的代码应该可以正常工作,它可以是你的Excel文件:

 [TestMethod] public void Current_Cell_Test() { //http://stackoverflow.com/questions/32516676/trying-to-read-excel-file-with-epplus-and-getting-system-nullexception-error //Throw in some data var datatable = new DataTable("tblData"); datatable.Columns.AddRange(new[] { new DataColumn("Col1", typeof (int)), new DataColumn("Col2", typeof (int)),new DataColumn("Col3", typeof (object)) }); for (var i = 0; i < 10; i++) { var row = datatable.NewRow(); row[0] = i; row[1] = i * 10; row[2] = Path.GetRandomFileName(); datatable.Rows.Add(row); } //Create a test file var fi = new FileInfo(@"c:\temp\test1.xlsx"); if (fi.Exists) fi.Delete(); using (var pck = new ExcelPackage(fi)) { var worksheet = pck.Workbook.Worksheets.Add("Sheet1"); worksheet.Cells.LoadFromDataTable(datatable, true); pck.Save(); } var dt = new DataTable(); using (ExcelPackage xlPackage = new ExcelPackage(fi)) { //Get the worksheet in the workbook ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets.First(); //Obtain the worksheet size ExcelCellAddress startCell = worksheet.Dimension.Start; ExcelCellAddress endCell = worksheet.Dimension.End; //Create the data column for (int col = startCell.Column; col <= endCell.Column; col++) { dt.Columns.Add(col.ToString()); } for (int row = startCell.Row; row <= endCell.Row; row++) { DataRow dr = dt.NewRow(); //Create a row int i = 0; for (int col = startCell.Column; col <= endCell.Column; col++) { dr[i++] = worksheet.Cells[row, col].Value.ToString(); } dt.Rows.Add(dr); } } Console.Write("{{dt Rows: {0} Columns: {1}}}", dt.Rows.Count, dt.Columns.Count); } 

在输出中给出这个:

 {Rows: 11, Columns: 3} 

当前是枚举时的当前范围。

在枚举范围内不使用debugging检查时抛出exception没有任何问题。

代码示例:

 var range = ws.Cells[1,1,1,100]; foreach (var cell in range) { var a = range.Current.Value; // a is same as b var b = cell.Value; } 

当我们给:

 dr[i++] = worksheet.Cells[row, col].Value.ToString(); 

它search该列的值,如果列是空的,则给出空引用错误。

改为:

 dr[i++] = worksheet.Cells[row, col].Text; 

希望这会有所帮助