Удалить пустые строки с помощью Excel Interop

У меня есть файлы Excel, предоставленные пользователем, которые нужно преобразовать в PDF. Используя взаимодействие с Excel, я могу сделать это с помощью .ExportAsFixedFormat () . Моя проблема возникает, когда в книге есть миллионы строк. Это превращается в файл с более чем 50 тысячами страниц. Было бы хорошо, если бы в книге было содержимое всех этих строк. Однако каждый раз, когда появляется один из этих файлов, может быть 50 строк с содержимым, а остальные пустые. Как мне удалить пустые строки, чтобы экспортировать их в PDF-файл приличного размера?

  1. Я пробовал начинать с конечной строки и, одну за другой, использовать CountA для проверки если в строке есть содержимое, а если есть, удалите его. Мало того, что это длится вечно, это, кажется, не работает примерно после 100 тыс. Строк со следующей ошибкой:

    Невозможно оценить выражение, потому что код оптимизирован или собственный фрейм находится поверх стека вызовов.

  2. Я попытался использовать SpecialCells (XlCellType.xlCellTypeLastCell, XlSpecialCellsValue.xlTextValues) , но это включает строку, если какая-либо ячейка имеет форматирование (например, цвет bg).

  3. Я пробовал использовать Рабочий лист.

    for (int i = 0; i < worksheets.Count; i++)
    {
        sheet = worksheets[i + 1];
        rows = sheet.Rows;
        currentRowIndex = rows.Count;
        bool contentFound = false;
    
        while (!contentFound && currentRowIndex > 0)
        {
            currentRow = rows[currentRowIndex];
    
            if (Application.WorksheetFunction.CountA(currentRow) == 0)
            {
                currentRow.Delete();
            }
            else
            {
                contentFound = true;
            }
    
            Marshal.FinalReleaseComObject(currentRow);
            currentRowIndex--;
        }
    
        Marshal.FinalReleaseComObject(rows);
        Marshal.FinalReleaseComObject(sheet);
    }
    

    for (int i = 0; i < worksheets.Count; i++)
    {
        sheet = worksheets[i + 1];
        rows = sheet.Rows;
    
        lastCell = rows.SpecialCells(XlCellType.xlCellTypeLastCell, XlSpecialCellsValue.xlTextValues);
        int startRow = lastCell.Row;
    
        Range range = sheet.get_Range(lastCell.get_Address(RowAbsolute: startRow));
        range.Delete();
    
        Marshal.FinalReleaseComObject(range);
        Marshal.FinalReleaseComObject(lastCell);
        Marshal.FinalReleaseComObject(rows);
        Marshal.FinalReleaseComObject(sheet);
    }
    

    Есть ли у меня проблемы с моим кодом, это проблема взаимодействия или, может быть, это просто ограничение возможностей Excel? Есть ли лучший способ сделать то, что я пытаюсь сделать?

14
задан Pilgerstorfer Franz 4 July 2015 в 16:24
поделиться