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

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

然而,这是一个问题,因为在完成之后,我们的模板占了最多的可能的行数,但是很多时候(大部分时间),我们甚至不使用它们的一半。

创build文件后,删除所有没有单元数据的行的最简单方法是直接使用Microsoft.Office.Interop.Excel.Workbook对象。 我们已经有了一个“清理”方法,在创build后运行,但是我想把这个逻辑添加进去。 这是我们目前的清理:

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对象。

假设所有的空行都在页面的底部,你应该能够select它们作为范围,然后把它们全部删除,就像我想的那样:

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

如果他们不在底部,也许你可以做一个sorting,以便他们最终在底部,然后使用类似于我的代码。

尝试以下。 它基本上经历了一个范围(我已经硬编码为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(); } } 

为了充分发挥function,使用COUNTA是我从OzGrid学到的技术。