Как указать расположение ячейки элемента управления ListObject (сортировка/фильтр) в приложении C# Excel Interop?

Я обнаружил здесь как добавить «ListObject» (я думаю об этом как «Управление сортировкой/фильтром») в электронную таблицу Excel. Вот упрощенный пример того, как это сделать:

// add the data
_xlSheetListObjectTest.Cells[1, 1] = "Marionberry";
_xlSheetListObjectTest.Cells[2, 1] = "Apple";
_xlSheetListObjectTest.Cells[3, 1] = "Strawberry";
_xlSheetListObjectTest.Cells[4, 1] = "Cashew";
_xlSheetListObjectTest.Cells[5, 1] = "Kumquat";
_xlSheetListObjectTest.Cells[6, 1] = "Pomegranate";
_xlSheetListObjectTest.Cells[7, 1] = "Banana";
_xlSheetListObjectTest.Cells[8, 1] = "Pineapple";
_xlSheetListObjectTest.Cells[9, 1] = "Kiwi";
_xlSheetListObjectTest.Cells[10, 1] = "Huckleberry";
_xlSheetListObjectTest.Cells[11, 1] = "Gooseberry";

// create a Sort/Filter Control for the data above
Excel.ListObject fruitList =
    _xlSheetListObjectTest.
        ListObjects.Add(Excel.XlListObjectSourceType.xlSrcRange,
            _xlSheetListObjectTest.Range[
                _xlSheetListObjectTest.Cells[1, 1],
                _xlSheetListObjectTest.Cells[11, 1]],
            Type.Missing, Excel.XlYesNoGuess.xlNo);

Это помещает «ListObject» прямо над заполненными ячейками, как можно увидеть здесь:

введите здесь описание изображения

А вот как это выглядит с выпавшим списком ListObject:

введите здесь описание изображения

Это потрясающая функциональность (много возможностей для небольшого количества кода) для такого рода требований. Однако у меня есть лист, содержащий столбцы данных за месяц, с требованием отфильтровать выбранные столбцы месяца (сортировка не нужна и нежелательна). Вот как это выглядит, когда при формировании отчета выбрано несколько месяцев:

введите здесь описание изображения

Но пользователь может создавать отчеты с меньшим количеством месяцев (от 1 до 13), например:

введите здесь описание изображения

Итак, я хочу «ListObject», чей диапазон операций фильтрации охватывает данные за отображаемые месяцы (много строк, много столбцов), с возможностью для пользователя затем отменить выбор определенных месяцев, скрывая всю строку [ы] невыбранных месяцев .

Однако с этим кодом, который определяет диапазон всех данных месяца:

Excel.ListObject monthFilterControl = // Resharper complains that this is not used (grays out "monthFilterControl"), but this is what creates the control
    _xlSheet.
        ListObjects.Add(Excel.XlListObjectSourceType.xlSrcRange,
            _xlSheet.Range[
                _xlSheet.Cells[COLUMN_HEADING_ROW, MONTH1_COL],
                _xlSheet.Cells[_xlSheet.UsedRange.Rows.Count, _xlSheet.UsedRange.Columns.Count - 1]],
            Type.Missing, Excel.XlYesNoGuess.xlNo);

Проблема в том, что несколько объектов ListObject пробиваются прямо к столбцам заголовков месяцев, сдвигая строки под ними и смещая строки. Мало того, то, что они предлагают сортировать и фильтровать, не соответствует моим жестким стандартам. Вместо того, чтобы позволить мне отфильтровать целые столбцы месяца, он делает следующее:

введите здесь описание изображения

Итак, что я хочу:

There should only be one ListObject control in a single cell a row above the month columns, not one in every month header cell.
A Filter list (array of checkboxes) of all Months; deselecting "September" would cause that month column to hide, etc.

Это возможно? Если да, то как я могу это сделать?


person B. Clay Shannon    schedule 04.12.2015    source источник
comment
Невозможно иметь автоматический фильтр в строке, которая показывает значения из нескольких столбцов (или, другими словами, у вас не может быть автоматического фильтра на основе значений строки). Автоматический фильтр работает только со значениями столбца. Как вариант Вы можете скопировать ячейки и вставить их, используя параметр Transpose. Он инвертирует вашу таблицу и преобразует столбцы в строки, а также изменяет формулы, чтобы они работали должным образом. Знайте, что вы можете применить фильтр к первому столбцу (ранее известному как ваша первая строка)   -  person Reza Aghaei    schedule 05.12.2015
comment
Еще один вариант Если в вашем приложении C# есть необработанные данные, вы можете выполнить такую ​​фильтрацию в своем приложении C#, а затем экспортировать в файл Excel только нужные столбцы.   -  person Reza Aghaei    schedule 05.12.2015
comment
Да, я могу выполнять всю эту фильтрацию с помощью C# и LINQ, но я не могу на лету вносить изменения в файл .xlsx. В этот момент это высечено в камне. Мне нужна какая-то функциональность, которая позволяет мне скрывать столбцы с помощью взаимодействия с пользователем. Значит, это невозможно?   -  person B. Clay Shannon    schedule 05.12.2015
comment
Трудно сказать, что что-то невозможно. Но насколько я знаю, вы не можете сделать это, просто используя стандартные и простые функции. Может быть, вы можете попробовать написать какой-нибудь макрос для выполнения такой работы. Но не рекомендую :)   -  person Reza Aghaei    schedule 06.12.2015
comment
Если Excel Whisperer рекомендует против этого, кто я такой, чтобы спорить?   -  person B. Clay Shannon    schedule 06.12.2015
comment
:)) Ваша скромность! Надеюсь, вы получите более точные ответы :)   -  person Reza Aghaei    schedule 06.12.2015