使用ExcelDataReader从特定单元格开始读取Excel数据

我正在使用ExcelDataReader从我的Excel工作簿在C#中读取数据。
但我的Excel工作表的结构是这样的,要读取的数据可以从任何特定的单元格开始,而不一定是A1

任何人可以请build议如何使用ExcelDataReader可以实现的方式?

更清楚的是,我将从头开始。

我将依靠https://exceldatareader.codeplex.com/中的示例代码,但要进行一些修改以避免不便之处。

以下代码检测文件格式,xls或xlsx。

 FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read); IExcelDataReader excelReader; //1. Reading Excel file if (Path.GetExtension(filePath).ToUpper() == ".XLS") { //1.1 Reading from a binary Excel file ('97-2003 format; *.xls) excelReader = ExcelReaderFactory.CreateBinaryReader(stream); } else { //1.2 Reading from a OpenXml Excel file (2007 format; *.xlsx) excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); } //2. DataSet - The result of each spreadsheet will be created in the result.Tables DataSet result = excelReader.AsDataSet(); //3. DataSet - Create column names from first row excelReader.IsFirstRowAsColumnNames = false; 

现在我们可以更方便地访问文件内容了。 我为此使用DataTable。 以下是访问特定单元格的示例,并在控制台中输出其值:

 DataTable dt = result.Tables[0]; Console.WriteLine(dt.Rows[rowPosition][columnPosition]); 

如果你不想做一个DataTable,你可以按照如下方式做:

 Console.WriteLine(result.Tables[0].Rows[rowPosition][columnPosition]); 

重要的是不要试图超出表的限制,因为你可以看到行数和列数,如下所示:

 Console.WriteLine(result.Tables[0].Rows.Count); Console.WriteLine(result.Tables[0].Columns.Count); 

最后,当你完成的时候,你应该closures阅读器并释放资源:

 //5. Free resources (IExcelDataReader is IDisposable) excelReader.Close(); 

希望对你有帮助。

(我的理解是这个问题很古老,但是我为了增强知识库做出了这个贡献,因为这个库的特定实现的材料很less)。

如果您使用的是ExcelDataReader 3+您会发现读取器对象没有任何AsDataSet()方法,您还需要为AsDataSet()安装另一个包,然后可以使用AsDataSet()方法。
此外, IsFirstRowAsColumnNames没有属性,而是需要将其设置在ExcelDataSetConfiguration

例:

 var file = new FileInfo(originalFileName); using ( var stream = File.Open(originalFileName, FileMode.Open, FileAccess.Read)) { IExcelDataReader reader; if (file.Extension.Equals(".xls")) reader = ExcelDataReader.ExcelReaderFactory.CreateBinaryReader(stream); else if (file.Extension.Equals(".xlsx")) reader = ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader(stream); else throw new Exception("Invalid FileName"); //// reader.IsFirstRowAsColumnNames var conf = new ExcelDataSetConfiguration { ConfigureDataTable = _ => new ExcelDataTableConfiguration { UseHeaderRow = true } }; var dataSet = reader.AsDataSet(conf); var dataTable = dataSet.Tables[0]; //... } 

你可以find像这样的单元格引用的行号和列号:

 var cellStr = "AB2"; // var cellStr = "A1"; var match = Regex.Match(cellStr, @"(?<col>[AZ]+)(?<row>\d+)"); var colStr = match.Groups["col"].ToString(); var col = colStr.Select((t, i) => (colStr[i] - 64) * Math.Pow(26, colStr.Length - i - 1)).Sum(); var row = int.Parse(match.Groups["row"].ToString()); 

现在你可以使用一些循环来读取这个单元格的数据,如下所示:

 for (var i = row; i < dataTable.Rows.Count; i++) { for (var j = col; j < dataTable.Columns.Count; j++) { var data = dataTable.Rows[i][j]; } } 

一种方式来做到这一点:

 FileStream stream = File.Open(@"c:\working\test.xls", FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); excelReader.IsFirstRowAsColumnNames = true; DataSet result = excelReader.AsDataSet(); 

result.Tables包含工作表和result.tables[0].Rows包含单元格行。

我发现这有用的阅读从一个特定的列和行

  FileStream stream = File.Open(@"C:\Users\Desktop\ExcelDataReader.xlsx", FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataSet result = excelReader.AsDataSet(); excelReader.IsFirstRowAsColumnNames = true; DataTable dt = result.Tables[0]; string text = dt.Rows[1][0].ToString(); 

你可以使用.NET库来做同样的事情,我相信它更直接。

 string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; data source={path of your excel file}; Extended Properties=Excel 12.0;"; OleDbConnection objConn = null; System.Data.DataTable dt = null; //Create connection object by using the preceding connection string. objConn = new OleDbConnection(connString); objConn.Open(); //Get the data table containg the schema guid. dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string sql = string.Format("select * from [{0}$]", sheetName); var adapter = new System.Data.OleDb.OleDbDataAdapter(sql, ConnectionString); var ds = new System.Data.DataSet(); string tableName = sheetName; adapter.Fill(ds, tableName); System.Data.DataTable data = ds.Tables[tableName]; 

在数据表中获得数据后,您可以像访问DataTable类一样进行访问。