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