【问题标题】:Using C# to sort a column in Excel使用 C# 对 Excel 中的列进行排序
【发布时间】:2020-07-03 01:03:20
【问题描述】:

我正在尝试使用 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#
  • 您遇到什么错误?您可能会说,Interop 的麻烦之一是必须将看似无穷无尽的参数传递给各种函数。有很多错误的余地。
  • @andrew 不确定如何将 vba 转换为 c#
  • 您的总体目标是什么?如果您只想使用 .NET 中的数据,将其加载到 DataTable 并在那里使用它可能更容易,而不是通过 Excel 互操作。

标签: c# excel interop


【解决方案1】:

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

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

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

我得到了上述答案的帮助,但是当我尝试 Code4Life 的 sn-p 时:

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

它只对范围的第一列进行排序。 OP 要求按一列对整个范围进行排序,而不是对范围中的一列进行排序。所以经过一些试验和错误后,我得到了上面的简化代码。

【讨论】:

  • 感谢您在处理讨厌的 COM 调用时非常有用。
【解决方案2】:

试试这个:

((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。上面的代码在 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);

【讨论】:

  • 非常感谢!!!!!!!不幸的是,它只对第一列而不是其余数据进行排序
  • 最后一列叫CO,89左右
  • 如果需要对超过 3 列进行排序,我建议将工作表数据提取到一个二维数组(var ar = (object[,]range.value2)中,然后对数组进行排序,最后将数组保存到工作表。
  • 对不起,你能告诉我那会是什么样子,再次谢谢你
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 2016-11-21
  • 2013-11-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
相关资源
最近更新 更多