使用C#对Excel中的列进行排序

使用C#对Excel中的列进行排序,c#,excel,interop,C#,Excel,Interop,我正在尝试使用INTEROP按excel中的第一列对工作表进行排序 我只需要第一列的整个范围的简单排序。我正在做以下工作: valueRange.Sort(valueRange.Columns[7, Type.Missing], Excel.XlSortOrder.xlAscending, valueRange.Columns[7, Type.Missing], Type.Missing, Excel.XlSortOrder.xlAscending, Type.M

我正在尝试使用
INTEROP
按excel中的第一列对工作表进行排序

我只需要第一列的整个范围的简单排序。我正在做以下工作:

valueRange.Sort(valueRange.Columns[7, Type.Missing], Excel.XlSortOrder.xlAscending, valueRange.Columns[7, Type.Missing],
                Type.Missing, Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortOrder.xlAscending, 
                Excel.XlYesNoGuess.xlNo, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, 
                Excel.XlSortMethod.xlPinYin, Excel.XlSortDataOption.xlSortNormal, 
                Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal);
但是会有错误。我无法找到有关如何进行此排序的适当文档

有没有人能给我一个简单的例子,一个特定列指定范围的排序

根据文档,我尝试这样做:

valueRange.Sort(valueRange.Columns[7, Type.Missing],
                        Excel.XlSortOrder.xlAscending,
                        Type.Missing,
                        Type.Missing,
                        Excel.XlSortOrder.xlAscending,
                        Type.Missing,
                        Excel.XlSortOrder.xlAscending,
                        Excel.XlYesNoGuess.xlNo,
                        Type.Missing,
                        Type.Missing,
                        Excel.XlSortOrientation.xlSortColumns,
                        Excel.XlSortMethod.xlStroke,
                        Excel.XlSortDataOption.xlSortNormal,
                        Excel.XlSortDataOption.xlSortNormal,
                        Excel.XlSortDataOption.xlSortNormal);
然而,现在我得到了错误:

{“排序引用无效。请确保它位于要排序的数据内,并且第一个排序依据框不相同或不为空。”}

试试这个:

((Excel.Range)valueRange.Columns.get_Item(1, Type.Missing))
    .Sort(valueRange.Columns[1, Type.Missing],
    Excel.XlSortOrder.xlAscending, Type.Missing, Type.Missing, 
    Excel.XlSortOrder.xlAscending, Type.Missing,
    Excel.XlSortOrder.xlAscending, Excel.XlYesNoGuess.xlGuess, 
    Type.Missing, Type.Missing, 
    Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin,   
    Excel.XlSortDataOption.xlSortNormal,
    Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal);
基本上,从
列进行
排序
,而不是基本范围

另外,如果可以的话,我强烈建议您使用VisualStudio2010。上述代码在VS 2010中简化为:

dynamic valueRange = GetTheRange();
valueRange.Columns.get_Item(1)).Sort(valueRange.Columns[1]);
编辑: 如果需要跨多个列进行排序,Excel允许您最多对三列进行排序。以下是您将如何做到这一点:

valueRange.Sort(valueRange.Columns[1, Type.Missing], // the first sort key
    Excel.XlSortOrder.xlAscending, 
    valueRange.Columns[2, Type.Missing], // second sort key
    Type.Missing, Excel.XlSortOrder.xlAscending, 
    valueRange.Columns[3, Type.Missing], // third sort key
    Excel.XlSortOrder.xlAscending, 
    Excel.XlYesNoGuess.xlGuess, Type.Missing, Type.Missing, 
    Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin,   
    Excel.XlSortDataOption.xlSortNormal,
    Excel.XlSortDataOption.xlSortNormal, 
    Excel.XlSortDataOption.xlSortNormal);
EDIT2: 将值加载到二维数组中:

var myArray = (object[,])valueRange.Value2;
将阵列加载回范围:

var arrayCount = myArray.GetLength(0);
var columnCount = GetTheColumnCountHere();
valueRange = valueRange.get_Resize(arrayCount, columnCount);
valueRange.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, myArray);

为了按某个范围内的单个列对该范围进行排序,您可以执行以下操作(如果您使用VS 2010及更高版本的“dynamic”关键字):

在我的示例中,我有一个大约有10列的电子表格,我想按第7列按降序对整个电子表格进行排序

上面的答案帮助了我,但当我尝试Code4Life的代码片段时:

dynamic valueRange = GetTheRange();
valueRange.Columns.get_Item(1)).Sort(valueRange.Columns[1]);

它只对范围的第一列进行排序。OP要求按一列对整个范围进行排序,而不是在一个范围内对一列进行排序。因此,经过一点尝试和错误,我得到了上面的简化代码。

您可以使用excel中的宏录制器录制宏,并将vba转换为c#查看您得到了什么错误?互操作的麻烦之一,正如您可能知道的,是必须将看似无穷无尽的参数传递给各种函数;有很大的错误空间。@andrew不确定如何将vba转换为c#你的总体目标是什么?若您只想使用.NET中的数据,那个么将其加载到DataTable并在那个里使用它可能比通过Excel Interop更容易。非常感谢!!!!!不幸的是,它只对第一列进行了排序,而没有对数据的其余部分进行排序。最后一列称为CO,大约89。如果需要对3列以上的列进行排序,我建议将工作表数据提取到二维数组中(
var ar=(object[,]range.value2
),然后对数组进行排序,最后将数组保存到工作表中。很抱歉,您能告诉我那是什么样子吗?再次感谢您在处理令人讨厌的COM调用时非常有用。
dynamic valueRange = GetTheRange();
valueRange.Columns.get_Item(1)).Sort(valueRange.Columns[1]);