Excel Interop 中是否有 "sister" 函数 "AutoFilter" 适用于列而不是行?

Is there a "sister" function to "AutoFilter" in Excel Interop that works for columns instead of rows?

Excel Interop 中的 "AutoFilter" 函数允许您过滤列显示下方行中的数据。

我需要一个类似的功能来允许用户 select 隐藏哪些列。例如,具体来说,如果有一组列 3..15 (C..0) 从 "Sep 15" 到 "Sep 16",它们之间有明显的月份("Oct 15",等等.) 我希望用户能够 select 查看这些列的任何子集。那些 deselected 会 "disappear"

如何实现?

我已经尝试了以下,但是第二个过滤器没有效果:

private void AddFilters()
{
    Range column1Row6 = _xlSheet.Range[_xlSheet.Cells[6, 1], _xlSheet.Cells[6, 1]];
    column1Row6.AutoFilter(1,
            Type.Missing,
            XlAutoFilterOperator.xlAnd,
            Type.Missing,
            true);

    // Try to filter columns, too (not the contents, but which columns display)
    Range columns3And4 = _xlSheet.Range[_xlSheet.Cells[6, 3], _xlSheet.Cells[6, 15]];
    columns3And4.AutoFilter(1,
            Type.Missing,
            XlAutoFilterOperator.xlAnd,
            Type.Missing,
            true);
}

这可能吗?

更新

查看一些遗留代码,似乎这段代码可以做到:

var fld = ((PivotField) pvt.PivotFields("Month"));
fld.Orientation = XlPivotFieldOrientation.xlColumnField;
fld.NumberFormat = "MMM yy";

具体来说,将 PivotField 的方向设置为 xlColumnField 会导致列显示 sort/filter 按钮,在操作时,有条件地 shows/hides 各种列。它是否根据数字格式确定哪些列是 showable/hideable ?也就是说,如果值为"Sep 15"或"Oct 16"是hiding/reshowing的候选?我不知道,但我在代码中看不到任何其他更具体地设置列过滤限制的内容。

更多背景信息:

var pch = _xlBook.PivotCaches();
pch.Add(XlPivotTableSourceType.xlDatabase, "PivotData!A1:H" + rowIdx).CreatePivotTable(_xlSheet.Cells[6, 1], "PivTab1", Type.Missing, Type.Missing);

var pvt = _xlSheet.PivotTables("PivTab1") as PivotTable;
if (pvt != null)
{
    pvt.MergeLabels = true;
    pvt.ErrorString = "";
    pvt.DisplayErrorString = true;

    var fld = ((PivotField) pvt.PivotFields("Description"));
    fld.Orientation = XlPivotFieldOrientation.xlRowField;

    fld = ((PivotField) pvt.PivotFields("Month"));
    fld.Orientation = XlPivotFieldOrientation.xlColumnField;
    fld.NumberFormat = "MMM yy";
    . . .

我不认为有这样的功能,但是使用数据透视表可以实现类似的功能。

我仍然需要努力让它看起来像样,但我确实找到了如何创建列过滤器,基于答案

使用以下代码:

var pch = _xlBook.PivotCaches();
// TODO: Make range dynamic
Range sourceData = _xlBook.Worksheets["PivotData"].Range["A1:G318"];

PivotCache pc = pch.Create(XlPivotTableSourceType.xlDatabase, sourceData);
PivotTable pvt = pc.CreatePivotTable(_xlPivotTableSheet.Range["A8"], "PivotTable");

pvt.PivotFields("Description").Orientation = XlPivotFieldOrientation.xlRowField;
pvt.PivotFields("MonthYr").Orientation = XlPivotFieldOrientation.xlColumnField;

...我可以从一个 sheet ("PivotData") 中获取源数据并将其放在另一个 sheet (_xlPivotTableSheet) 上。给我 "filter a set of columns" 功能的部分是上面的最后一行。这给我留下了以下内容:

虽然看不到,但有“201509”一栏和“201510”一栏,可以过滤显示或不显示,单独显示或集中显示。

现在让其余数据正常显示...