2014-02-12 54 views
30

我是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屬性。我無法在庫中的任何對象上找到Rows屬性。

如何遍歷表,讀Row for Row?

+0

您是否找到解決方案? –

+0

我最終使用了'Microsoft.Office.Interop.Excel'類。他們支持閱讀Table對象。你只需要知道Excel中的表格在API中被稱爲'ListObjects'。 –

+0

我正在離開Interop。有幾個問題,如果它們被破壞,它無法處理文件。我用我找到的鏈接提出了一個答案。 –

回答

1

林不知道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 
+1

LinqToExcel支持寫入excel嗎? –

+1

對不起,不幸的是它沒有。 –

+0

由於您的答案,我從OpenXml移到了LinqToExcel。謝謝 –

62

得到它,而在同一搜索幫助問題,我偶然發現了link。它當然對我有用!絕對比使用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. 
    } 
} 
+1

你已經把計數器倒過來了,你應該這樣做:'workSheet.Cells [j,i]'因爲語法是'[row,column]''但你的情況你做了'[column,row]'。 –

+1

Thanks @Marjan。請參閱更新的代碼! :) –

+9

我發現工作表不是從零開始的。我不得不使用'package.Workbook.Worksheets [1]'來獲得第一張工作表。 – SkipHarris

8

您可以訪問表和索引的細胞.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); 
    } 
} 
+0

如何獲得ExcelTable對象?我看不到它在EPPlush –

+2

@BjarkiHeiðar的示例項目中使用的問題; 'excelPackage.Workbook.Worksheets.SelectMany(s => s.Tables)' – AlexFoxGill

11

這裏有一種方式來獲得完整的行作爲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 
    // ... 
} 
+1

你介意添加代碼如何獲取單元格的文本嗎? –

0

我有同樣的問題,我解決它使用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]; 
       ... 
      } 
     } 
    } 
} 

您需要檢查表頭或其他東西,但做的把戲我。