我是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)
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)
小智 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)
您需要检查表头或其他内容,但这对我来说很有效。
我不确定 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)