在excel中最后一列之前删除

时间:2018-08-10 11:58:29

标签: c# excel-interop

此代码将删除最后一列。运行正常:

Microsoft.Office.Interop.Excel.Range last = xlWorkSheet.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell, Type.Missing);      
last.EntireColumn.Delete(Missing.Value);

但是,如果我将上面的代码与下面的代码结合起来:

Microsoft.Office.Interop.Excel.Range last1 = xlWorkSheet.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
last1.EntireColumn.Delete(Missing.Value);

..组合的代码将删除1列而不是2列。为什么?

我的逻辑是,如果我删除最后一列,然后尝试再次获取新的LastCell并删除,它将删除2,但是由于某种原因没有发生。

2 个答案:

答案 0 :(得分:2)

这是因为xlCellTypeLastCell的值将保持不变,直到关闭并重新打开工作簿 (可以通过编程方式将其重置。请参见下面的“更新”部分)< / em>。您可以通过检查last1.Column的值来确保这一点,您会发现它与last.Column相同。

此行为也可以在Excel本身中手动观察到。尝试在Excel中手动 删除列,然后按 Ctrl + End 。您会注意到激活的单元格仍在空白列中。 xlCellTypeLastCell的作用是模仿 Ctrl + End 的行为。

相反,您可以使用其他方法来获取最后使用的列。这样的事情应该起作用:

首先,在文件顶部添加以下行以简化名称空间:

using MSOffice = Microsoft.Office.Interop;

然后您可以执行以下操作:

MSOffice.Excel.Range last = 
    xlWorkSheet.Cells.Find(What: "*", After: xlWorkSheet.Cells[1, 1], 
                           SearchOrder: MSOffice.Excel.XlSearchOrder.xlByColumns, 
                           SearchDirection: MSOffice.Excel.XlSearchDirection.xlPrevious);
last.EntireColumn.Delete();

MSOffice.Excel.Range last1 =
    xlWorkSheet.Cells.Find(What: "*", After: xlWorkSheet.Cells[1, 1],
                           SearchOrder: MSOffice.Excel.XlSearchOrder.xlByColumns,
                           SearchDirection: MSOffice.Excel.XlSearchDirection.xlPrevious);
last1.EntireColumn.Delete();

注意:由于较新版本的C#(自C#4.0开始)支持可选参数,因此您不必使用Missing.Value unless you're using a version prior to C# 4.0


更新:

好像有一种方法可以重置通过第一个方法检索到的最后一个单元格的值,那就是调用Worksheet.UsedRange。因此,如果愿意,仍然可以使用您的方法,但是每次都必须重置该值:

MSOffice.Excel.Range last = 
    xlWorkSheet.Cells.SpecialCells(MSOffice.Excel.XlCellType.xlCellTypeLastCell);
last.EntireColumn.Delete();

var dummy = xlWorkSheet.UsedRange;

MSOffice.Excel.Range last1 = 
    xlWorkSheet.Cells.SpecialCells(MSOffice.Excel.XlCellType.xlCellTypeLastCell);
last1.EntireColumn.Delete();

答案 1 :(得分:-1)

我认为您应该只使用For Loop来删除所需的列数。 像

for (int i = 0; i < 2; i++)
{
  last.EntireColumn.Delete(Missing.Value);
}

didnt对此进行了测试,但希望它能起作用:)您明白了