У меня есть файлы Excel, предоставленные пользователем, которые нужно преобразовать в PDF. Используя взаимодействие с Excel, я могу сделать это с помощью .ExportAsFixedFormat ()
. Моя проблема возникает, когда в книге есть миллионы строк. Это превращается в файл с более чем 50 тысячами страниц. Было бы хорошо, если бы в книге было содержимое всех этих строк. Однако каждый раз, когда появляется один из этих файлов, может быть 50 строк с содержимым, а остальные пустые. Как мне удалить пустые строки, чтобы экспортировать их в PDF-файл приличного размера?
Я пробовал начинать с конечной строки и, одну за другой, использовать CountA
для проверки если в строке есть содержимое, а если есть, удалите его. Мало того, что это длится вечно, это, кажется, не работает примерно после 100 тыс. Строк со следующей ошибкой:
Невозможно оценить выражение, потому что код оптимизирован или собственный фрейм находится поверх стека вызовов.
Я попытался использовать SpecialCells (XlCellType.xlCellTypeLastCell, XlSpecialCellsValue.xlTextValues)
, но это включает строку, если какая-либо ячейка имеет форматирование (например, цвет bg).
Я пробовал использовать Есть ли у меня проблемы с моим кодом, это проблема взаимодействия или, может быть, это просто ограничение возможностей Excel? Есть ли лучший способ сделать то, что я пытаюсь сделать? Рабочий лист.
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);
}