используя c # для сортировки столбца в Excel - PullRequest
4 голосов
/ 02 апреля 2012

Я пытаюсь отсортировать лист по первому столбцу в Excel с помощью INTEROP. я просто хочу простой вид всего диапазона по первому столбцу. я делаю следующее:

 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."}

Ответы [ 2 ]

13 голосов
/ 09 августа 2012

Чтобы отсортировать диапазон по одному столбцу в этом диапазоне, вы можете сделать что-то вроде следующего (если вы используете 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]);

отсортировано только по первому столбцу диапазона. ОП попросил отсортировать весь диапазон по одному столбцу, а не один столбец в диапазоне. Поэтому после небольшой проб и ошибок я получил упрощенный код, описанный выше.

3 голосов
/ 02 апреля 2012

Попробуйте это:

((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]);

EDIT : Если вам нужно отсортировать по нескольким столбцам, 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...