使用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]);