GemBox - для цикла для строк и столбцов?

У меня есть вопрос. Есть ли способ, которым я мог бы просмотреть все столбцы/строки в электронной таблице, используя цикл 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++;
}

Проблема в том, что я хотел бы присвоить значение каждой ячейки новой переменной и передать ее другому методу. Я хотел бы использовать для этого циклы, и я знаю, что могу использовать CalculateMaxUsedColumns в качестве ограничения для столбцов, но есть ли такое свойство, которое я мог бы использовать для строк?!

Вот что я хотел бы сделать:

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

Любая помощь будет принята с благодарностью. Спасибо!!!


person jansyb04    schedule 02.07.2013    source источник
comment
Я использую программное обеспечение Gembox для обработки электронной таблицы.   -  person jansyb04    schedule 02.07.2013


Ответы (1)


Вот способ, которым вы можете выполнить итерацию в GemBox.Spreadsheet по всем столбцам/строкам электронной таблицы, используя цикл for. Просмотрите CellRange, возвращаемый ExcelWorksheet.GetUsedCellRange.

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 и по-прежнему извлекать индексы строк и столбцов с помощью ExcelCell.Row.Index и ExcelCell.Column.Index, и вы можете извлекать имена без использования этих статических методов (без RowColumnToPosition, RowIndexToName и 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.Rows.Count и ExcelWorksheets.CalculateMaxUsedColumns(), чтобы получить последнюю использованную строку и столбец.

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();
}
person Mario Z    schedule 20.08.2013