簡體   English   中英

如何“清理” Microsoft.Office.Interop.Excel.Workbook

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM