2012-04-02 157 views
4

我想通过使用INTEROP的excel中的第一列对工作表进行排序。我只想在第一列中列出一个简单的整个范围。我正在做以下事情:使用c#在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); 

但是现在我越来越errorrs:

{"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

您可以使用宏记录器在excel中记录宏,并将vba转换为c# – Andrew 2012-04-02 19:13:41

+0

请参阅[本MSDN链接](http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel。 namedrange.sort.aspx#Y0) – 2012-04-02 19:14:42

+0

你有什么错误? Interop的麻烦之一,正如你可能会说的那样,必须将各种功能看似无尽的参数传递给它;有很多错误的余地。 – 2012-04-02 19:17:15

回答

8

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

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要求按一列对整个范围进行排序,而不对一个范围内的一列进行排序。所以经过一些试验和错误,我得到了我上面的简化代码。

+2

非常感谢您在与他们讨论讨厌的COM调用时非常有用。 – 2016-07-01 20:05:14

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: 加载值到一个二维数组:

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

太谢谢你了! !不幸的是它只是排序的第一列,而不是其他数据 – 2012-04-02 19:44:32

+0

哎你在吗?再次感谢您的帮助 – 2012-04-02 19:54:18

+0

有多少列? – code4life 2012-04-02 19:56:51