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

我是新来的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属性。 我无法在库中的任何对象上findRows属性。

如何遍历一个表,读Row for Row?

在寻找同样问题的帮助时,我偶然发现了这个链接 。 这当然对我有效! 绝对比使用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. } } 

这里有一个方法来获得完整的行为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 // ... } 

您可以访问表的.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); } } 

我不知道epplus,但我想我会使用LinqToExcel快速build议

 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 

我有同样的问题,我解决了它使用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]; ... } } } } 

你需要检查表头或其他东西,但是这对我来说是个诡计。