如何使用epplus遍历excel表中的行?

oɔɯ*_*ɯǝɹ 46 c# excel epplus

我是epplus的新手,我正试图从excel表中读取一些值.

这是我到目前为止:

var fileInfo = new FileInfo(filename);
using(var excelPackage = new OfficeOpenXml.ExcelPackage(fileInfo))
{
    foreach (var sheet in excelPackage.Workbook.Worksheets)
    {
        foreach (ExcelTable table in sheet.Tables)
        {
             foreach(var row in table.Rows)  // <-- !!
             { ... }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,现在我很难过,因为ExcelTable唯一Columns有财产,但不是Rows我预期的财产.我找不到Rows库中任何对象的属性.

如何遍历表格,阅读Row for Row?

Chr*_*ton 91

在寻找同一问题的帮助时,我偶然发现了这个链接.它肯定对我有用!绝对比使用Interop对象更好.:)

我稍微调整了一下:

var package = new ExcelPackage(new FileInfo("sample.xlsx"));

ExcelWorksheet workSheet = package.Workbook.Worksheets[0];
var start = workSheet.Dimension.Start;
var end = workSheet.Dimension.End;
for (int row = start.Row; row <= end.Row; row++)
{ // Row by row...
    for (int col = start.Column; col <= end.Column; col++)
    { // ... Cell by cell...
        object cellValue = workSheet.Cells[row, col].Text; // This got me the actual value I needed.
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现工作表不是从零开始的.我不得不使用`package.Workbook.Worksheets [1]`来获取第一个工作表. (17认同)
  • 工作表是基于.NET 4及以上的1,基于.Net Core 2.0(netstandard2.0)的0表示https://github.com/JanKallman/EPPlus/blob/master/EPPlus/ExcelPackage.cs#L1206 (6认同)

Tim*_*ter 15

这是一种获取完整行的方法ExcelRange,然后可以迭代或用于LINQ:

for (var rowNum = 1; rowNum <= sheet.Dimension.End.Row; rowNum++)
{
    var row = sheet.Cells[string.Format("{0}:{0}", rowNum)];
    // just an example, you want to know if all cells of this row are empty
    bool allEmpty = row.All(c => string.IsNullOrWhiteSpace(c.Text));
    if (allEmpty) continue; // skip this row
    // ...
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*ill 11

您可以访问.Worksheet表的属性并索引其单元格.我为此编写了一个扩展方法,它生成一系列将列名称映射到单元格值的字典:

public static IEnumerable<IDictionary<string, object>> GetRows(this ExcelTable table)
{
    var addr = table.Address;
    var cells = table.WorkSheet.Cells;

    var firstCol = addr.Start.Column;

    var firstRow = addr.Start.Row;
    if (table.ShowHeader)
        firstRow++;
    var lastRow = addr.End.Row;

    for (int r = firstRow; r <= lastRow; r++)
    {
        yield return Enumerable.Range(0, table.Columns.Count)
            .ToDictionary(x => table.Columns[x].Name, x => cells[r, firstCol + x].Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @BjarkiHeiðar看到了这个问题; `excelPackage.Workbook.Worksheets.SelectMany(s => s.Tables)` (2认同)

小智 6

我遇到了同样的问题,我使用 来ExcelTable获取表边界并使用 来ExcelWorksheet检索数据来解决它。所以你的代码看起来像这样:

var fileInfo = new FileInfo(filename);
using(var excelPackage = new OfficeOpenXml.ExcelPackage(fileInfo))
{
    foreach (var sheet in excelPackage.Workbook.Worksheets)
    {
        foreach (ExcelTable table in sheet.Tables)
        {
            ExcelCellAddress start = table.Address.Start;
            ExcelCellAddress end = table.Address.End;

            for (int row = start.Row; row <= end.Row; ++row)
            {
                ExcelRange range = sheet.Cells[row, start.Column, row, end.Column];
                ...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要检查表头或其他内容,但这对我来说很有效。


Zac*_*cer 2

我不确定 epplus,但我想我会快速建议使用LinqToExcel

var excel = new ExcelQueryFactory(excel);

var info = excel.Worksheet("Sheet1")
                .Select(z=> new
                     {
                      Name = row["Name"].Cast<string>(),
                      Age = row["Age"].Cast<int>(),
                     }).ToList();
Run Code Online (Sandbox Code Playgroud)

你可以从 NuGet 获取它

Install-Package LinqToExcel
Run Code Online (Sandbox Code Playgroud)