2012-04-02 132 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