我正在尝试使用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);
但是现在我得到了错误:
{"The sort reference is not valid. Make sure that it's within the data you want to sort, and the first Sort By box isn't the same or blank."}
答案 0 :(得分:13)
为了按该范围内的单个列对范围进行排序,您可以执行以下操作(如果您使用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要求将整个范围排序一列,而不是对一个范围内的一列进行排序。经过一些试验和错误后,我得到了上面的简化代码。
答案 1 :(得分: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);