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

Chh*_*shJ 23 c# excel exceldatareader

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

任何人都可以建议如何使用ExcelDataReader

shA*_*A.t 42

如果您正在使用,ExcelDataReader 3+您将发现没有任何方法可以AsDataSet()为您的读者对象,您还需要安装另一个包ExcelDataReader.DataSet,然后您可以使用该AsDataSet()方法.
此外,没有一个属性,IsFirstRowAsColumnNames你需要在里面设置它ExcelDataSetConfiguration.

例:

using (var stream = File.Open(originalFileName, FileMode.Open, FileAccess.Read))
{
    IExcelDataReader reader;

    // Create Reader - old until 3.4+
    ////var file = new FileInfo(originalFileName);
    ////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");
    // Or in 3.4+ you can only call this:
    reader = ExcelDataReader.ExcelReaderFactory.CreateReader(stream)

    //// reader.IsFirstRowAsColumnNames
    var conf = new ExcelDataSetConfiguration
    {
        ConfigureDataTable = _ => new ExcelDataTableConfiguration
        {
            UseHeaderRow = true 
        }
    };

    var dataSet = reader.AsDataSet(conf);

    // Now you can get data from each sheet by its index or its "name"
    var dataTable = dataSet.Tables[0];

    //...
}
Run Code Online (Sandbox Code Playgroud)

您可以找到单元格引用的行号和列号,如下所示:

var cellStr = "AB2"; // var cellStr = "A1";
var match = Regex.Match(cellStr, @"(?<col>[A-Z]+)(?<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());
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

您可以使用此配置在读取时过滤Excel工作表的行和列:

var i = 0;
var conf = new ExcelDataSetConfiguration
{
    UseColumnDataType = true,
    ConfigureDataTable = _ => new ExcelDataTableConfiguration
    {
        FilterRow = rowReader => fromRow <= ++i - 1,
        FilterColumn = (rowReader, colIndex) => fromCol <= colIndex,
        UseHeaderRow = true
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在新版本(v3.4)中不需要验证文件扩展名,因为 ExcelDataReader 为我们验证。如果文件扩展名无效,则会产生异常。[参考](https://github.com/ExcelDataReader/ExcelDataReader#how-to-use) (2认同)
  • @LuisEduardox tnx,我更新我的答案以显示您的评论;)。 (2认同)

ces*_*sAR 21

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

我将依赖于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;
Run Code Online (Sandbox Code Playgroud)

现在我们可以以更方便的方式访问文件内容.我使用DataTable.以下是访问特定单元格并在控制台中打印其值的示例:

DataTable dt = result.Tables[0];
Console.WriteLine(dt.Rows[rowPosition][columnPosition]);
Run Code Online (Sandbox Code Playgroud)

如果您不想执行DataTable,可以执行以下操作:

Console.WriteLine(result.Tables[0].Rows[rowPosition][columnPosition]);
Run Code Online (Sandbox Code Playgroud)

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

Console.WriteLine(result.Tables[0].Rows.Count);
Console.WriteLine(result.Tables[0].Columns.Count);
Run Code Online (Sandbox Code Playgroud)

最后,当你完成后,你应该关闭阅读器并释放资源:

//5. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助.

(我知道这个问题很老,但我做了这个贡献来增强知识库,因为关于这个库的特定实现的材料很少).


小智 7

对于 ExcelDataReader v3.6.0 及更高版本。 我努力迭代行。所以这里对上面的代码多一点。希望它至少对少数人有帮助。

using (var stream = System.IO.File.Open(copyPath, FileMode.Open, FileAccess.Read))
                    {

                        IExcelDataReader excelDataReader = ExcelDataReader.ExcelReaderFactory.CreateReader(stream);

                        var conf = new ExcelDataSetConfiguration()
                        {
                            ConfigureDataTable = a => new ExcelDataTableConfiguration
                            {
                                UseHeaderRow = true
                            }
                        };

                        DataSet dataSet = excelDataReader.AsDataSet(conf);
                        //DataTable dataTable = dataSet.Tables["Sheet1"];
                        DataRowCollection row = dataSet.Tables["Sheet1"].Rows;
                        //DataColumnCollection col = dataSet.Tables["Sheet1"].Columns;

                        List<object> rowDataList = null;
                        List<object> allRowsList = new List<object>();
                        foreach (DataRow item in row)
                        {
                            rowDataList = item.ItemArray.ToList(); //list of each rows
                            allRowsList.Add(rowDataList); //adding the above list of each row to another list
                        }

                    }
Run Code Online (Sandbox Code Playgroud)

  • 先生,您在互联网上赢了所有的钱。感谢您发布此内容! (2认同)

Sie*_*jet 6

一种方法是:

FileStream stream = File.Open(@"c:\working\test.xls", FileMode.Open, FileAccess.Read);

IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);

excelReader.IsFirstRowAsColumnNames = true;

DataSet result = excelReader.AsDataSet();
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我发现这对于从特定的列和行读取很有用:

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();
Run Code Online (Sandbox Code Playgroud)