c# java - epplus를 사용하여 Excel 테이블의 행을 반복하는 방법은 무엇입니까?




document (5)

나는 epplus 엑셀 테이블에서 값을 읽으려고합니다.

이것은 내가 지금까지 가지고있는 것이다.

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

그러나 ExcelTableColumns 속성 만 가질 수 있지만 Rows 속성은 예상하지 ExcelTable 때문에 지금 당황 스럽습니다. 라이브러리의 모든 객체에서 Rows 속성을 찾을 수 없습니다.

Row 행을 읽으면 테이블을 반복 할 수 있습니까?


Answers

같은 문제에 대한 도움을 찾고있는 동안, 나는이 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.
    }
}

ExcelRange 로 전체 행을 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 을 사용하는 LinqToExcel 대한 빠른 제안을 할 것이라고 생각 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

답변을 게시하면 내 "질문"에 답을 표시 할 수 있습니다.

나는 다른 해결 방법을 보았지만 이것이 더 단순 해 보이고 전혀 효과가 없다는 것에 놀랐다.

Sub ChangeIt(c1 As Range, c2 As Range)
    c1.Value = c2.Value
    c1.Interior.Color = IIf(c1.Value > 10, vbRed, vbYellow)
End Sub


'########  run as a UDF, this actually changes the sheet ##############
' changing value in c2 updates c1...
Function SetIt(src, dest)

    dest.Parent.Evaluate "Changeit(" & dest.Address(False, False) & "," _
                        & src.Address(False, False) & ")"

    SetIt = "Changed sheet!" 'or whatever return value is useful...

End Function

공유하고 싶은 흥미로운 응용 프로그램이 있다면 추가 답변을 게시하십시오.

참고 : 모든 종류의 실제 "생산"응용 프로그램에서 테스트되지 않았습니다.





c# excel epplus