C# 删除excel中最后一列之前的内容

C# 删除excel中最后一列之前的内容,c#,excel-interop,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); 但是,如果我将上面的代码与下面的代码结合起来: Microso

此代码将删除最后一列。它工作得很好:

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列,而不是两列。为什么?


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

我认为您应该使用for循环确实删除您想要的列数。 比如:

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

我还没有测试过,但希望它能起作用:)你明白了,这是因为
xlCellTypeLastCell
的值将保持不变,直到工作簿关闭并重新打开(它可以通过编程方式重置。请参阅下面的“更新”部分)。您可以通过检查
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#4.0的较新版本支持可选参数,因此不必使用
Missing.Value


更新: 看起来有一种方法可以重置第一个方法检索到的最后一个单元格的值,那就是调用
工作表.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();

你能按你的顺序写代码吗?@Haytam嗯,和我写的顺序一样。前两行,后两行。正是那个顺序。这行不通。您从未更改上次
的值,您希望它如何引用(或删除)其他列?这两个代码都有效!感谢您花时间详细地写下这一切。