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”一栏,可以过滤显示或不显示,单独显示或集中显示。
现在让其余数据正常显示...
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”一栏,可以过滤显示或不显示,单独显示或集中显示。
现在让其余数据正常显示...