我有一些用户提供的Excel文件需要转换为PDF。使用Excel Interop,我可以使用.ExportAsFixedFormat()
轻松完成此操作。但是当工作簿具有数百万行时,问题就出现了。这将变成一个具有50k+页面的文件。如果工作簿中所有这些行都有内容,那么这将是可以接受的。然而,每次出现这些文件时,可能只有50行具有内容,其余为空白。我该如何去除空行,以便将其导出到大小合适的PDF中?
我尝试从最后一行开始,逐个使用
CountA
检查该行是否具有内容,如果有,则删除它。不仅这需要很长时间,而且在大约100k行后会出现以下错误:由于代码已经被优化或原生框架位于调用堆栈的顶部,无法计算表达式。
我尝试使用
SpecialCells(XlCellType.xlCellTypeLastCell,XlSpecialCellsValue.xlTextValues)
,但是如果任何单元格具有格式(如背景颜色),则会包括该行。我尝试使用
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的限制?有没有更好的方法来实现我想要做的事情?