Я обнаружил здесь как добавить «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.
Это возможно? Если да, то как я могу это сделать?
Transpose
. Он инвертирует вашу таблицу и преобразует столбцы в строки, а также изменяет формулы, чтобы они работали должным образом. Знайте, что вы можете применить фильтр к первому столбцу (ранее известному как ваша первая строка) - person Reza Aghaei   schedule 05.12.2015