我有用户提供的需要转换为PDF的excel文件。使用excel interop,我可以用.ExportAsFixedFormat()
来做到这一点。当工作簿拥有数百万行时,我的问题就出现了。这变成了一个有50k +页面的文件。如果工作簿包含所有这些行的内容,那就没问题了。每次有这些文件中的一个出现时,大概有50行有内容,其余都是空白的。我怎样才能去除空行,以便我可以将它导出为体面大小的PDF?使用Excel Interop删除空行
我试着从末端开始行,一个接一个,使用检查,如果该行有内容,如果是的话,将其删除。这不仅需要永久,这似乎失败后约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可以做什么的限制?有没有更好的方法来做我正在尝试的?
我真的很想看看这个话题。你有一个演示文件来进行测试吗? – 2015-07-04 17:19:37
@PilgerstorferFranz对不起,我没有。这个项目早已不复存在。 – Chris 2015-07-04 23:32:42
你找到解决方案吗? – 2015-07-05 04:26:13