我有用户提供的需要转换为 PDF 的 excel 文件。使用 excel 互操作,我可以用.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 功能的限制?有没有更好的方法来做我正在尝试的事情?