Подтвердить что ты не робот

Как перебирать строки в таблице 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)  // <-- !!
             { ... }
        }
    }
}

Однако теперь я озадачен, поскольку ExcelTable имеет свойство Columns, но не свойство Rows, как я ожидал. Я не могу найти свойство Rows для любого объекта в библиотеке.

Как выполнить итерацию по таблице, прочитав строку Row для строки?

4b9b3361

Ответ 1

При поиске справки по той же проблеме я наткнулся на эту ссылку . Это, безусловно, сработало для меня! Определенно лучше, чем использование объектов 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.
    }
}

Ответ 2

Здесь можно получить полную строку как 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
    // ...
}

Ответ 3

Вы можете получить доступ к свойству .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);
    }
}

Ответ 4

Я не уверен в 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();

вы можете получить его из NuGet

Install-Package LinqToExcel

Ответ 5

У меня была та же проблема, и я решил ее использовать с помощью 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];
                ...
            }
        }
    }
}

Вам нужно проверить заголовок таблицы или другие вещи, но это помогло мне.