C#Excel PivotItem可见性

时间:2019-04-05 16:34:18

标签: c# excel vba

我想使用C#从Excel筛选器获取复选框的值。 enter image description here

所以...

Proj_1 should be true
Proj_2 should be true
Proj_3 should be false
Proj_4 should be false

以下是我当前正在使用的代码,但item.Visible始终为false,无论UI是否被选中(除非我取消选中“ Select Multiple Items”),但我都需要选中

  foreach (PivotField fld in pivotFields)
                {
                    Console.WriteLine(fld.Name + " -- " + fld.Orientation + " -- " + fld.EnableItemSelection + " -- " + fld.EnableMultiplePageItems + " -- ");

                    foreach (PivotItem item in fld.PivotItems(Type.Missing))
                    {
                        if (item.Visible == true)
                        {
                            Console.WriteLine("Item"  + item.Name + " in field " + fld.Name + "is Visible  (Selected)");
                        }
                        else
                        {
                            Console.WriteLine("Item" + item.Name + " in field " + fld.Name + "is Hidden (Not Selected)");
                        }
                    }

                }

1 个答案:

答案 0 :(得分:0)

如果添加了Microsoft.Office.Interop.Excel库,这将起作用:

enter image description here

namespace ExcelAtSomething
{
    using System;
    using Excel = Microsoft.Office.Interop.Excel;

    class Startup
    {
        static void Main()
        {
            string filePath = @"C:\Users\stackoverflow\Desktop\Sample.xlsx";
            Excel.Application excel = new Excel.Application();
            excel.Visible = true;
            excel.EnableAnimations = true;

            Excel.Workbook wkb = Open(excel, filePath);

            foreach (Excel.Worksheet xlWorksheet in wkb.Worksheets)
            {
                Excel.PivotTables pivotTablesCollection = xlWorksheet.PivotTables();
                if (pivotTablesCollection.Count > 0)
                {
                    for (int i = 1; i <= pivotTablesCollection.Count; i++)
                    {
                        Excel.PivotTable currentPivotTable = pivotTablesCollection.Item(i);
                        Console.WriteLine($"Table is named -> {currentPivotTable.Name}");

                        foreach (Excel.PivotField pivotField in currentPivotTable.PivotFields())
                        {
                            Console.WriteLine($"\nField is named -> {pivotField.Name}");
                            foreach (Excel.PivotItem visibleItems in pivotField.VisibleItems)
                            {
                                Console.WriteLine($"Visible item name -> {visibleItems.Name}");
                            }

                            foreach (Excel.PivotItem PivotItem in pivotField.PivotItems())
                            {
                                Console.WriteLine($"Item is named -> {PivotItem.Name}");
                                Console.WriteLine(PivotItem.Visible);
                            }
                        }
                    }
                }
            }

            excel.EnableAnimations = true;
            wkb.Close(true);
            excel.Quit();
            Console.WriteLine("Finished!");
        }

        private static Excel.Workbook Open(Excel.Application excelInstance,
                string fileName, bool readOnly = false,
                bool editable = true, bool updateLinks = true)
        {
            Excel.Workbook book = excelInstance.Workbooks.Open(
                fileName, updateLinks, readOnly,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing);
            return book;
        }
    }
}

诀窍在于,除了PivotItem外,还有一个PivotField,它具有其可见项的列表。如果显示这些,则仅显示可见的:

enter image description here

稍稍播放一下并可能自定义一个函数,该函数返回不在该列表中的不可见项对于Excel是一个不错的选择。