2010-12-09 123 views
1

所以我有一個Microsoft.Office.Interop.Excel.Workbook對象。它基本上使用模板Excel文件來構建自己。 Excel文件包含結果部分的模板列顏色等,然後​​代碼基本上只是打印在這些模板列上,它實際上並沒有自定義文件本身的外觀,只是將數據放入其中。如何「清理」Microsoft.Office.Interop.Excel.Workbook

但是,這是一個問題,因爲完成後,我們的模板會佔用最多的可用行數,但很多時間(大部分時間),我們甚至不使用其中的一半。

在創建文件後直接使用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; 
     } 

P.S.這是該文檔中兩張表格中的第一張。如果這樣做更容易,我也可以訪問Microsoft.Office.Interop.Excel.Worksheet對象。

+1

不是針對您的實際問題,而是針對代碼示例中的註釋。你沒有正確地清理東西,如果你這樣做,你不需要`GC.Collect();`。您應該釋放您在任何地方創建的所有對象(其中包括始終保留對創建的所有內容的引用)。看到這個問題的更多細節:http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c – 2010-12-09 13:45:36

回答

0

假設所有的空行是在表的底部,你應該能夠選擇他們作爲一個範圍,然後將它們全部刪除,這樣的事情,我認爲:

Excel.Range range = _sheet.get_Range("A501", "A60000"); 
Excel.Range row = range.EntireRow; 
rowDelete(Type.Missing); 

如果他們」不要在底部,也許你可以做一個排序,以便他們都在底部,然後使用類似於我的代碼。

+0

這是要刪除只有行沒有數據在他們中?因爲所有的行都有顏色或標記,但沒有數據。 – slandau 2010-12-09 14:03:46

+0

這會刪除所有行,無論它看起來如何... – slandau 2010-12-09 14:07:40

0

請嘗試以下操作。它基本上經歷了一個範圍(我已經硬編碼爲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(); 
      } 
     } 

要充分的信用,使用COUNTA是一個技術,我從OzGrid教訓。