我有用戶提供的需要轉換爲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