次の方法で共有


スプレッドシート ドキュメント内の非表示のワークシートの一覧を取得する

このトピックでは、Open XML SDK for Office のクラスを使用して、ドキュメントを Excel に読み込まずに、Microsoft Excel ブック内の非表示のワークシートの一覧をプログラムで取得する方法について説明します。 このタスクを示すメソッド GetHiddenSheets 例が含まれています。

GetHiddenSheets メソッド

GetHiddenSheets メソッドを使用して、ブック内の非表示のワークシートの一覧を取得できます。 GetHiddenSheets メソッドは、1 つのパラメーター (調べるファイルのパスを示す文字列) を受け取ります。 メソッドは、指定したブックで機能し、非表示の各Sheet オブジェクトへの参照をList<T> インスタンスに入力します。

ワークシートのコレクションを取得する

WorkbookPart クラスは、Workbook プロパティを提供します。このプロパティにはブックの XML コンテンツが含まれます。 Open XML SDK には、Sheet パーツのコレクションを返す Sheets プロパティが用意されていますが、必要なすべての情報は、Workbook XML コンテンツ内のSheet要素によって提供されます。 次のコードでは、Workbook オブジェクトの Descendants ジェネリック メソッドを使用して、ブックの XML コンテンツのすべてのシート子要素に関する情報を含むSheet オブジェクトのコレクションを取得します。

WorkbookPart? wbPart = document.WorkbookPart;

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

非表示のシートを取得する

Excel では 2 つのレベルのワークシートがサポートされていることに注意することが重要です。 Excel ユーザー インターフェイスを使用し、ワークシートのタブを右クリックしてワークシートの非表示を選ぶと、ワークシートを非表示にできます。 これらのワークシートの場合、Sheet オブジェクトの State プロパティには、列挙値の Hidden が含まれます。 また、シートの Visible プロパティを列挙値 xlSheetVeryHiddenに設定するコード (VBA または別の言語) を記述することで、ワークシートを非常に非表示にすることもできます。 この方法で非表示になっているワークシートの場合、Sheet オブジェクトの State プロパティには、列挙値VeryHiddenが含まれます。

すべてのシートに関する情報を含むコレクションを指定すると、次のコードでは、 Where 関数を使用してコレクションをフィルター処理し、 State プロパティが null ではないシートのみが含まれるようにします。 State プロパティが null でない場合、コードは、State プロパティが値として格納され、値がSheetStateValues.HiddenまたはSheetStateValues.VeryHiddenであるSheet オブジェクトを検索します。

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 コード サンプルを次に示します。

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;
}