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

4

我正在尝试使用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中使用宏录制器录制宏,并将VBA转换为C#。 - Andrew
请参见此MSDN链接 - chris neilsen
你遇到了什么错误?正如你可能已经知道的那样,Interop 的一个麻烦是必须向各种函数传递看似无穷无尽的参数;这里有很多出错的空间。 - Patrick Pitre
1
你的整体目标是什么?如果你只想在.NET中处理数据,那么将其加载到DataTable并在那里进行操作可能会更容易,而不是通过Excel Interop来处理。 - mellamokb
@mellamokb 不,我确实需要Interop。我正在对一个具有格式和许多花哨内容的Excel文件进行更改,并且我需要保留它。 - Alex Gordon
显示剩余3条评论
2个回答

15

如果你正在使用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]);

它只对范围的第一列进行了排序。原帖作者要求按一列排序整个范围,而不是在范围内对一列进行排序。所以经过一些尝试和错误,我得到了上面简化的代码。


2
非常感谢,这对于处理那些讨厌的COM调用非常有用。 - Leo Gurdian

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

此外,如果可以的话,我强烈建议使用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: 将值加载到二维数组中:

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

非常感谢您!!!!不幸的是,它只对第一列进行了排序,而没有对其他数据进行排序。 - Alex Gordon
最后一列称为CO,约为89。 - Alex Gordon
如果您需要按超过3列进行排序,我建议将工作表数据提取到一个二维数组中(var ar = (object[,]range.value2),然后对数组进行排序,最后将数组保存到工作表中。 - code4life
对不起,您可以展示一下那会是什么样子吗?再次感谢。 - Alex Gordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接