[英]How to save Microsoft.Office.Interop.Excel.Workbook in ASP.NET
[英]How to “clean up” Microsoft.Office.Interop.Excel.Workbook
所以我有一個Microsoft.Office.Interop.Excel.Workbook對象。 它基本上使用模板Excel文件來構造自身。 Excel文件包含結果部分等的模板列顏色,然后代碼基本上只是在這些模板列上打印,它實際上並未自定義文件本身的外觀,僅將數據放入其中。
但是,這是一個問題,因為完成后,我們的模板會盡其所能地處理最可能的行,但是在很多時候(大部分時間),我們甚至不使用其中的一半。
直接創建與Microsoft.Office.Interop.Excel.Workbook對象一起工作的文件后,刪除其中沒有單元格數據的所有行的最簡單方法是什么。 我們已經有一個在創建后運行的“清理”方法,但是我想在其中添加邏輯。 這是我們當前的清理:
private void CleanupExcel()
{
if (!_visible && _workbook != null)
{
_workbook.Close(false, Missing.Value, Missing.Value);
}
_workbook = null;
_sheet = null;
if (_excel != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(_excel);
// WW, 5/26/09: not sure if a problem here, but it probably is since the code was taken from here
// but in the indicator, Excel exists in the process even after the app is closed. The code here seems to fix it.
GC.Collect();
GC.WaitForPendingFinalizers();
}
_excel = null;
}
PS順便說一句,這是文檔中兩張紙中的第一張。 如果這樣做更容易,我也可以訪問Microsoft.Office.Interop.Excel.Worksheet對象。
假設所有空行都位於工作表的底部,您應該能夠將它們選擇為一個范圍,然后將其全部刪除,我認為是這樣的:
Excel.Range range = _sheet.get_Range("A501", "A60000");
Excel.Range row = range.EntireRow;
rowDelete(Type.Missing);
如果它們不在底部,也許您可以進行某種排序,使它們最終都位於底部,然后使用類似於我的代碼的方法。
嘗試以下方法。 它基本上經過一個范圍(我已將其硬編碼為A1:A10),檢查哪些行為空,將其標記為刪除,然后進行掃描並刪除它們。
public void RemoveRows()
{
Excel.Range rng = Application.get_Range("A1", "A10");
List<int> rowsMarkedForDeletion = new List<int>();
for(int i = 0; i < rng.Rows.Count; i++)
{
if(Application.WorksheetFunction.CountA(rng[i + 1].EntireRow) == 0)
{
rowsMarkedForDeletion.Add(i + 1);
}
}
for(int i = rowsMarkedForDeletion.Count - 1; i >= 0; i--)
{
rng[rowsMarkedForDeletion[i]].EntireRow.Delete();
}
}
為了獲得滿分,我從OzGrid中學到了使用COUNTA的技術。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.