使用C#在Excel中对列进行排序
本文关键字:排序 Excel 使用 | 更新日期: 2023-09-27 18:29:57
我正在尝试使用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);
然而,现在我得到了错误:
{"排序引用无效。请确保它在要排序的数据中,并且第一个"排序依据"框不相同或为空。"}
为了按范围中的单列对范围进行排序,您可以执行以下操作(如果您使用的是带有"dynamic"关键字的VS 2010及以上版本):
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要求按一列对整个范围进行排序,而不是对一个范围中的一列进行排序。因此,经过一点尝试和错误,我得到了上面的简化代码。
试试这个:
((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);
基本上,从Column
进行Sort
,而不是基本范围。
此外,如果可以的话,我强烈建议您使用Visual Studio 2010。上面的代码在VS2010:中被简化为
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);
编辑2:将值加载到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);