我通过vsto 3.0遇到了Excel2007的问题。在我的项目中,我需要偶尔移动列。通常情况下,这样做很好,但我最近发现,当数据被过滤并且匹配的数据是非连续的时,会出现问题。
例如,使用此数据集:
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)
方法。
我已经在这件事上苦思冥想太久了,似乎在我自己的头脑里或是在广大的互联网上都找不到解决办法。任何帮助都将不胜感激。