如何使用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]; ... } } } }
你需要检查表头或其他东西,但是这对我来说是个诡计。