C# 如何";“清理”;Microsoft.Office.Interop.Excel.Workbook

C# 如何";“清理”;Microsoft.Office.Interop.Excel.Workbook,c#,.net,excel,C#,.net,Excel,因此,我有一个Microsoft.Office.Interop.Excel.Workbook对象。它基本上使用一个模板Excel文件来构建自己。Excel文件包含结果部分的模板列颜色等,然后代码基本上只打印在这些模板列上,它实际上并不自定义文件本身的外观,只将数据放入其中 然而,这是一个问题,因为在完成之后,我们的模板将尽可能多地占用行,但是很多时候(大多数时候),我们甚至不使用其中的一半 创建文件后,直接使用Microsoft.Office.Interop.Excel.Workbook对象删除

因此,我有一个Microsoft.Office.Interop.Excel.Workbook对象。它基本上使用一个模板Excel文件来构建自己。Excel文件包含结果部分的模板列颜色等,然后代码基本上只打印在这些模板列上,它实际上并不自定义文件本身的外观,只将数据放入其中

然而,这是一个问题,因为在完成之后,我们的模板将尽可能多地占用行,但是很多时候(大多数时候),我们甚至不使用其中的一半

创建文件后,直接使用Microsoft.Office.Interop.Excel.Workbook对象删除所有不包含单元格数据的行的最简单方法是什么。我们已经有了一个在创建之后运行的“cleanup”方法,但我想将该逻辑添加到它中。以下是我们当前的清理工作:

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;
        }

顺便说一下,这是文件中两页的第一页。如果更方便的话,我还可以访问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();
            }
        }
public void remoterows()
{
Excel.Range rng=Application.get_Range(“A1”、“A10”);
列表行markedfordeletion=new List();
对于(int i=0;i=0;i--)
{                
rng[rowsMarkedForDeletion[i].EntireRow.Delete();
}
}

要完全归功于此,使用COUNTA是我从中学到的一种技巧。

不是针对您的实际问题,而是针对代码示例中的注释。您没有正确地清理东西,如果这样做了,就不需要
GC.Collect()。您应该释放在任何地方创建的所有对象(包括始终保持对已创建的所有对象的引用)。有关更多详细信息,请参见此问题:这是否只删除其中没有数据的行?因为所有行中都有颜色或一些标记,但没有数据。@slandau:是的,此代码只是删除代码,您必须将参数更改为
get\u Range
才能删除任何行。如果我理解正确,您的应用程序就是将数据放入模板的应用程序,因此我假设它也知道填充了多少行。因此,如果它填充了1225行,那么将
“A501”
更改为
“1226”
(或者如果您有一个标题,可能是
“1227”
),希望所有这些都能工作。因此,Delete()方法的参数类型.Missing并没有指定我要删除缺少信息的行?@slandau:No,也就是说没有参数。你能告诉我你看到了什么编译器错误吗?我的项目中没有编译器错误。