检索电子表格文档中隐藏工作表的列表

本主题演示如何使用 Open XML SDK for Office 中的类以编程方式检索Microsoft Excel 2010或Microsoft Excel 2010工作簿中的隐藏工作表列表,而无需将文档加载到 Excel 中。 本主题包含一个演示此任务的示例 GetHiddenSheets 方法。

GetHiddenSheets 方法

可以使用 GetHiddenSheets 方法检索工作簿中隐藏工作表的列表。 GetHiddenSheets 方法接受一个参数,即一个指示要分析的文件路径的字符串。 方法适用于指定的工作簿,使用对每个隐藏 Sheet 对象的引用填充 List<T> 实例。

检索工作表的集合

WorkbookPart 类提供 Workbook 属性,该属性又包含工作簿的 XML 内容。 尽管 Open XML SDK 提供 Sheet 属性,该属性返回工作表部件的集合,但所需的所有信息都由 Workbook XML 内容中的 Sheet 元素提供。 以下代码使用 Workbook 对象的 Descendants 泛型方法检索 Sheet 对象的集合,这些对象包含有关工作簿 XML 内容的所有工作表子元素的信息。

WorkbookPart? wbPart = document.WorkbookPart;

if (wbPart is not null)
{
    var sheets = wbPart.Workbook.Descendants<Sheet>();

检索隐藏的工作表

请务必注意 Excel 支持两个级别的工作表。 您可以使用 Excel 用户界面通过右键单击工作表选项卡并选择隐藏工作表来隐藏该工作表。 对于这些工作表,Sheet 对象的 State 属性包含一个枚举值 Hidden。 您还可以通过编写代码(可以是 VBA 也可以是其他语言)来隐藏工作表,该代码将工作表的 Visible 属性设置为枚举值 xlSheetVeryHidden。 对于以这种方式隐藏的工作表,Sheet 对象的 State 属性包含枚举值 VeryHidden

给定包含有关所有工作表的信息的集合,以下代码使用 Where 函数筛选集合,使其仅包含 State 属性不为 null 的工作表。 如果 State 属性不为 null,则代码将查找 Sheet 对象,其中 State 属性作为值,并且值是 SheetStateValues.HiddenSheetStateValues.VeryHidden

var hiddenSheets = sheets.Where((item) => item.State is not null &&
    item.State.HasValue &&
    (item.State.Value == SheetStateValues.Hidden ||
    item.State.Value == SheetStateValues.VeryHidden));

示例代码

下面是 C# 和 Visual Basic 中的完整 GetHiddenSheets 示例代码。

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;
using System.Linq;

static List<Sheet> GetHiddenSheets(string fileName)
{
    List<Sheet> returnVal = new List<Sheet>();

    using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
    {
        WorkbookPart? wbPart = document.WorkbookPart;

        if (wbPart is not null)
        {
            var sheets = wbPart.Workbook.Descendants<Sheet>();

            // Look for sheets where there is a State attribute defined, 
            // where the State has a value,
            // and where the value is either Hidden or VeryHidden.

            var hiddenSheets = sheets.Where((item) => item.State is not null &&
                item.State.HasValue &&
                (item.State.Value == SheetStateValues.Hidden ||
                item.State.Value == SheetStateValues.VeryHidden));

            returnVal = hiddenSheets.ToList();
        }
    }

    return returnVal;
}