使用过滤器重新排序Excel表格列

时间:2009-12-28 18:12:20

标签: c# excel vsto excel-2007 autofilter

我通过VSTO 3.0遇到了Excel 2007的问题。在我的项目中,我需要偶尔对列进行洗牌。通常情况下,这种方法很好但我最近发现,当数据被过滤并且适合的数据是非连续的时,会出现问题。

例如,使用此数据集:

Ohio        Eastern
Kentucky    Eastern
Illinois    Central
California  Pacific
Florida     Eastern

如果第二列上的过滤器排除了Pacific或Central,则以下代码会产生错误。

ListObject table = FindReportTable();
// Get data to shuffle around.
ListColumn tempColumn = table.ListColumns.Add(missing);
Range range1 = table.ListColumns[column1].Range;
Range range2 = table.ListColumns[column2].Range;
Range tempRange = tempColumn.Range;
// Swap the rows.
range1.Copy(tempRange); // This is where an error is thrown.
range2.Copy(range1);
tempRange.Copy(range2);
tempColumn.Delete();

抛出的错误是System.Runtime.InteropServices.COMException,错误代码为-2146827284,并显示消息“该命令不能用于多个选择”。

我尝试了很多东西,似乎没有一件事完全奏效。如果我使用table.AutoFilter.ShowAllData(),我可以继续没有任何问题,但我已经清除了用户的过滤器,并且无法按照我的假设使用table.AutoFilter.ApplyFilter()取回它们。

我无法可靠地存储和重新创建过滤器有两个原因:一,迭代table.AutoFilter.Filters并且如果过滤器中的数据集太大,存储过滤器的数据可能会导致问题。参考我的示例数据,如果过滤器要从第2列中排除Central,则尝试检索过滤器的信息会导致互操作错误。其次,要重新创建过滤器,我需要知道过滤器最初在哪一行传递到table.Range.AutoFilter(object, object, XlFilterOperator, object, object)方法。

我一直在反对这个问题太久了,似乎无法在我自己的脑海中或在庞大的互联网上找到解决方案。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我会考虑删除并重新创建过滤器。如果您遇到问题,那么您应该解决这些问题。

查看 ListObject.AutoFilter.Filters 集合。

查看here了解更多信息。