0

我有个问题。有没有一种方法可以让我使用 for 循环遍历电子表格中的所有列/行?现在我在我的代码中使用这样的 foreach 循环:(你可以忽略里面发生的事情)。

foreach (ExcelRow row in w1.Rows)
{
    foreach (ExcelCell cell in row.AllocatedCells)
    {

        Console.Write("row: {0}", globalVar.iRowActual);
        if (globalVar.iRowActual > 1)
        {
             cellValue = SafeCellValue(cell);
             Console.WriteLine("value is: {0}", cellValue);
        }


    }
    globalVar.iRowActual++;
}

问题是我想将每个单元格的值分配给一个新变量并将其传递给另一个方法。我想为此使用 for 循环,并且我知道我可以使用 CalculateMaxUsedColumns 作为 cols 的限制,但是是否有这样的属性,我可以将其用于行?!

这就是我想做的:

 int columnCount = ws.CalculateMaxUsedColumns();
 int rowCount = ws.CalculateMaxUsedRows(); ------> PART I NEED HELP WITH
 for(int i=0; i <columnCount; i++){
     for(int j = 0; j<rowCount; j++){
           .....
     }
 }

任何形式的帮助将不胜感激。谢谢!!!

4

1 回答 1

6

这是一种在 GemBox.Spreadsheet 中使用for循环遍历电子表格中所有列/行的方法。遍历ExcelWorksheet.GetUsedCellRange方法返回的CellRange 。

ExcelFile workbook = ExcelFile.Load("Sample.xlsx");
ExcelWorksheet worksheet = workbook.Worksheets[0];

CellRange range = worksheet.GetUsedCellRange(true);
for (int r = range.FirstRowIndex; r <= range.LastRowIndex; r++)
{
    for (int c = range.FirstColumnIndex; c <= range.LastColumnIndex; c++)
    {
        ExcelCell cell = range[r - range.FirstRowIndex, c - range.FirstColumnIndex];

        string cellName = CellRange.RowColumnToPosition(r, c);
        string cellRow = ExcelRowCollection.RowIndexToName(r);
        string cellColumn = ExcelColumnCollection.ColumnIndexToName(c);

        Console.WriteLine(string.Format("Cell name: {1}{0}Cell row: {2}{0}Cell column: {3}{0}Cell value: {4}{0}",
            Environment.NewLine, cellName, cellRow, cellColumn, (cell.Value) ?? "Empty"));
    }
}

编辑

在较新的版本中,有一些额外的 API 可以简化这一点。例如,您现在可以使用foreach并且仍然可以使用 and 检索行和列索引,ExcelCell.Row.Index并且ExcelCell.Column.Index您可以在不使用那些静态方法(不使用RowColumnToPosition, RowIndexToNameand ColumnIndexToName)的情况下检索名称。

ExcelFile workbook = ExcelFile.Load("Sample.xlsx");
ExcelWorksheet worksheet = workbook.Worksheets[0];

foreach (ExcelRow row in worksheet.Rows)
{
    foreach (ExcelCell cell in row.AllocatedCells)
    {
        Console.WriteLine($"Cell value:   {cell.Value ?? "Empty"}");
        Console.WriteLine($"Cell name:    {cell.Name}");
        Console.WriteLine($"Row index:    {cell.Row.Index}");
        Console.WriteLine($"Row name:     {cell.Row.Name}");
        Console.WriteLine($"Column index: {cell.Column.Index}");
        Console.WriteLine($"Column name:  {cell.Column.Name}");
        Console.WriteLine();
    }
}

此外,还有另外两种方法可以循环遍历工作表单元格for

1)使用ExcelWorksheets.CalculateMaxUsedColumns()获取最后使用的行和列ExcelWorksheets.Rows.Count

ExcelFile workbook = ExcelFile.Load("Sample.xlsx");
ExcelWorksheet worksheet = workbook.Worksheets[0];

int rowCount = worksheet.Rows.Count;
int columnCount = worksheet.CalculateMaxUsedColumns();

for (int r = 0; r < rowCount; r++)
{
    for (int c = 0; c < columnCount; c++)
    {
        ExcelCell cell = worksheet.Cells[r, c];

        Console.WriteLine($"Cell value:  {cell.Value ?? "Empty"}");
        Console.WriteLine($"Cell name:   {cell.Name}");
        Console.WriteLine($"Row name:    {cell.Row.Name}");
        Console.WriteLine($"Column name: {cell.Column.Name}");
        Console.WriteLine();
    }
}

如果您有一个不统一的电子表格,其中行具有不同的列数(例如,第一行有 10 个单元格,第二行有 100 个单元格等),那么您可以使用以下更改以避免迭代非分配的单元格:

int rowCount = worksheet.Rows.Count;

for (int r = 0; r < rowCount; r++)
{
    ExcelRow row = worksheet.Rows[r];
    int columnCount = row.AllocatedCells.Count;

    for (int c = 0; c < columnCount; c++)
    {
        ExcelCell cell = row.Cells[c];

        // ...
    }
}

2)使用CellRange.GetReadEnumerator方法,它只遍历范围内已分配的单元格。

ExcelFile workbook = ExcelFile.Load("Sample.xlsx");
ExcelWorksheet worksheet = workbook.Worksheets[0];

CellRangeEnumerator enumerator = worksheet.Cells.GetReadEnumerator();
while (enumerator.MoveNext())
{
    ExcelCell cell = enumerator.Current;

    Console.WriteLine($"Cell value:  {cell.Value ?? "Empty"}");
    Console.WriteLine($"Cell name:   {cell.Name}");
    Console.WriteLine($"Row name:    {cell.Row.Name}");
    Console.WriteLine($"Column name: {cell.Column.Name}");
    Console.WriteLine();
}
于 2013-08-20T09:24:25.863 回答