スプレッドシート ドキュメント内の非表示のワークシートの一覧を取得する
このトピックでは、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;
}