次の方法で共有


スプレッドシート ドキュメント内の非表示の行または列の一覧を取得する

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


GetHiddenRowsOrCols メソッド

GetHiddenRowsOrCols メソッドを使用して、ワークシート内の非表示の行または列の一覧を取得できます。 メソッドは、指定されたワークシートに非表示の行または列が含まれている場合に、非表示の行または列の各インデックスを含む符号なし整数のリストを返します (行と列の番号は 0 ではなく 1 から始まります)。 GetHiddenRowsOrCols メソッドは 3 つのパラメーターを受け取ります。

  • 確認するドキュメントの名前 (文字列)。

  • 確認するシートの名前 (文字列)。

  • 行 (true) と列 (false) のどちらを検出するか (ブール型)。


コードの動作のしくみ

コードは、 メソッドを使用してドキュメントを開き、読み取り専用アクセス (最終的な false パラメーター値) のためにドキュメントを開く必要があることを示します。 次に、コードはドキュメントの WorkbookPart プロパティを使用して、ブック パーツへの参照を取得します。

using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
    if (document is not null)
    {
        WorkbookPart wbPart = document.WorkbookPart ?? document.AddWorkbookPart();

非表示の行または列を検出するには、まず、対象となるシートの名前を指定してシートへの参照を取得します。 これは、一般に考えるほど簡単ではありません。 コードは、ブック パーツの Workbook プロパティのすべてのシートタイプの子孫を調べ、見つけた各シートの Name プロパティを調べる必要があります。 この検索では、ブックの関係を調べるだけで、ワークシート パーツを実際に検出するわけではありません。 シートの名前やIdプロパティなどの情報を含む、Sheet オブジェクトへの参照を検索するだけです。 この検索は、LINQ クエリを使用すると最も簡単に実行できます。

Sheet? theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault((s) => s.Name == sheetName);

既に取得したシート情報は、Id プロパティを提供し、Id プロパティを指定すると、コードは、WorkbookPart オブジェクトのGetPartById メソッドを呼び出すことによって、対応するWorksheetPart プロパティへの参照を取得できます。

// The sheet does exist.
WorksheetPart? wsPart = wbPart.GetPartById(theSheet.Id!) as WorksheetPart;
Worksheet? ws = wsPart?.Worksheet;

非表示の行または列のインデックス値のリストの取得

コードでは、 メソッドを呼び出したときに指定した detectRows パラメーターを使用して、行または列に関する情報を取得するかどうかを判断します。非表示の行の一覧を実際に取得するコードでは、1 行のコードのみが必要です。

// Retrieve hidden rows.
itemList = ws.Descendants<Row>()
    .Where((r) => r?.Hidden is not null && r.Hidden.Value)
    .Select(r => r.RowIndex?.Value)
    .Cast<uint>()
    .ToList();

非表示の列の一覧を取得すると、非表示の列のグループが 1 つの要素に折りたたまれており、グループの最初と最後の列を記述する Min プロパティと Max プロパティが提供されるため、少し難しい方法です。 Excel では、非表示の列のグループは 1 つの要素にまとめられ、グループ内の先頭の列と末尾の列がそれぞれ Min プロパティとMax プロパティで示されるからです。 ただし、インデックス値を反復処理する必要があります (非表示の列のコレクション内の各項目をループし、 Min の各インデックスを Max 値に包括的に追加します)。

var cols = ws.Descendants<Column>().Where((c) => c?.Hidden is not null && c.Hidden.Value);

foreach (Column item in cols)
{
    if (item.Min is not null && item.Max is not null)
    {
        for (uint i = item.Min.Value; i <= item.Max.Value; i++)
        {
            itemList.Add(i);
        }
    }
}

サンプル コード

C# と Visual Basic の完全な GetHiddenRowsOrCols コード サンプルを次に示します。

static List<uint> GetHiddenRowsOrCols(string fileName, string sheetName, string detectRows = "false")
{
    // Given a workbook and a worksheet name, return 
    // either a list of hidden row numbers, or a list 
    // of hidden column numbers. If detectRows is true, return
    // hidden rows. If detectRows is false, return hidden columns. 
    // Rows and columns are numbered starting with 1.
    List<uint> itemList = new List<uint>();

    using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
    {
        if (document is not null)
        {
            WorkbookPart wbPart = document.WorkbookPart ?? document.AddWorkbookPart();

            Sheet? theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault((s) => s.Name == sheetName);

            if (theSheet is null || theSheet.Id is null)
            {
                throw new ArgumentException("sheetName");
            }
            else
            {

                // The sheet does exist.
                WorksheetPart? wsPart = wbPart.GetPartById(theSheet.Id!) as WorksheetPart;
                Worksheet? ws = wsPart?.Worksheet;

                if (ws is not null)
                {
                    if (detectRows.ToLower() == "true")
                    {
                        // Retrieve hidden rows.
                        itemList = ws.Descendants<Row>()
                            .Where((r) => r?.Hidden is not null && r.Hidden.Value)
                            .Select(r => r.RowIndex?.Value)
                            .Cast<uint>()
                            .ToList();
                    }
                    else
                    {
                        // Retrieve hidden columns.
                        var cols = ws.Descendants<Column>().Where((c) => c?.Hidden is not null && c.Hidden.Value);

                        foreach (Column item in cols)
                        {
                            if (item.Min is not null && item.Max is not null)
                            {
                                for (uint i = item.Min.Value; i <= item.Max.Value; i++)
                                {
                                    itemList.Add(i);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    return itemList;
}

関連項目