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

问题描述 投票:4回答:2

我正在尝试使用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);

但是现在我得到了错误:

{“排序参考无效。请确保它在您要排序的数据内,并且第一个“排序依据”框不相同或为空白。”]

c# excel interop
2个回答
14
投票

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

dynamic allDataRange = worksheet.UsedRange;
allDataRange.Sort(allDataRange.Columns[7], Excel.XlSortOrder.xlDescending);

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

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

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

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


3
投票

尝试一下:

((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);

基本上,从Sort开始而不是从基本范围开始Column

此外,如果可以的话,我强烈建议使用Visual Studio 2010。上面的代码在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:将值加载到2D数组中:

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);
© www.soinside.com 2019 - 2024. All rights reserved.