with recorrer read officeopenxml ejemplos create c# excel epplus

recorrer - officeopenxml c#



¿Cómo puedo iterar a través de las filas en una tabla de Excel usando epplus? (5)

Esta es una forma de obtener la fila completa como ExcelRange que luego puede ser iterada o utilizada para 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 // ... }

Soy nuevo en epplus , y estoy tratando de leer algunos valores de una tabla de Excel.

Esto es lo que tengo hasta ahora:

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) // <-- !! { ... } } } }

Sin embargo, ahora estoy perplejo, ya que ExcelTable solo tiene una propiedad Columns , pero no una propiedad Rows como esperaba. No puedo encontrar una propiedad Rows en ningún objeto de la biblioteca.

¿Cómo puedo iterar a través de una tabla, leyendo Row for Row?


Mientras buscaba ayuda sobre el mismo problema, me encontré con este link . ¡Ciertamente funcionó para mí! Definitivamente mejor que usar objetos Interop. :)

Sin embargo, lo adapté ligeramente:

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. } }


No estoy seguro de Epplus, pero pensé que haría una sugerencia rápida de usar 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();

puedes obtenerlo de NuGet

Install-Package LinqToExcel


Puede acceder a la propiedad .Worksheet de una tabla e indexar sus celdas. Escribí un método de extensión para este propósito, que genera una serie de diccionarios asignando el nombre de la columna al valor de la celda:

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); } }


Tuve el mismo problema y lo resolví utilizando ExcelTable para obtener el límite de la tabla y ExcelWorksheet para recuperar los datos. Entonces su código se verá algo como esto:

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]; ... } } } }

Necesitas comprobar el encabezado de la tabla u otras cosas, pero eso fue lo que hizo.