c# ClosedXMLを使用して、xlsxファイル内の文字列を検索する

ClosedXMLは ExcelやWordなど、XMLドキュメントのファイルを読み書きできるオープンソースのライブラリです。

ClosedXML

GitHub - ClosedXML/ClosedXML: ClosedXML is a .NET library for reading, manipulating and writing Excel 2007+ (.xlsx, .xlsm) files. It aims to provide an intuitive and user-friendly interface to dealing with the underlying OpenXML API.
ClosedXML is a .NET library for reading, manipulating and writing Excel 2007+ (.xlsx, .xlsm) files. It aims to provide an intuitive and user-friendly interface ...

実行環境にExcelがインストールされていなくても、Excelファイルを読み書きできます。

ClosedXMLを使う際の注意点として、xls形式(旧 Excel 2003以前のファイル形式)が処理できないということです。

この記事では、ClosedXMLを用いて、xlsxファイル内の文字列を検索して結果を表示する処理をC#で実装する方法を紹介します。

ソースコード


        /// <summary>
        /// 検索結果クラス
        /// </summary>
        public class SearchResult
        {
            /// <summary>
            /// ワークシート名
            /// </summary>
            public string workSheetName {get; set;}

            /// <summary>
            /// 行番号
            /// </summary>
            /// <value></value>
            public int rowNumber{get; set;}

            /// <summary>
            /// 列番号
            /// </summary>
            /// <value></value>
            public int colNumber{get; set;}

            /// <summary>
            /// セル値(文字列型)
            /// </summary>
            /// <value></value>
            public string cellStringValue{get; set;}
        }

        /// <summary>
        /// xlsxファイル内を文字列検索する
        /// </summary>
        /// <param name=searchTerms>検索文字列</param>
        /// <param name=xlsxFileFullPath>検索対象xlsxファイルパス</param>
        /// <returns>検索結果(SearchResultClass)</returns>
        public List<SearchResult> SearchTermsInXlsx(string searchTerms, string xlsxFileFullPath)
        {

            List<SearchResult> listSearchResult = new List<SearchResult>();

            using(var wb = new XLWorkbook(xlsxFileFullPath))
            {

                foreach(var ws in wb.Worksheets){

                    string wsName = ws.Name;

                    //終端行番号取得
                    int lastRowUsedNumber = ws.LastRowUsed().RowNumber();

                    //終端列番号取得
                    int lastColUsedNumber = ws.LastColumnUsed().ColumnNumber();

                    int wRow = 0;
                    int wCol = 0;

                    for(wRow = 1; wRow <= lastRowUsedNumber; wRow++)
                    {
                        for (wCol = 1; wCol <= lastColUsedNumber; wCol++)
                        {
                            // Console.WriteLine(${wRow}:{wCol} in {wsName} {ws.Cell(wRow, wCol).Value.ToString()});

                            SearchResult sr = new SearchResult();
                            sr.workSheetName = wsName;
                            sr.rowNumber = wRow;
                            sr.colNumber = wCol;
                            sr.cellStringValue = ws.Cell(wRow, wCol).Value.ToString();

                            // セル文字列の中に検索文字列が含まれている場合、リストオブジェクトへ追加する
                            if(sr.cellStringValue.Contains(searchTerms)){
                                listSearchResult.Add(sr);                            
                            }

                        }
                    }
                }
            }
            return listSearchResult;
        }

クラスと関数

SearchResult はクラスです。以下のメンバーを定義しています。

  • workSheetName : ワークシート名
  • rowNumber : 検索してヒットした行番号
  • colNumber : 検索してヒットした列番号
  • cellStringValue : 検索してヒットしたセルの値(文字列型)

SearchTermsInXlsx は関数です。入出力関係は以下のとおり定義しています。

  • 入力
    • searchTerms : 検索文字列
    • xlsxFileFullPath : 検索対象xlsxファイルフルパス
  • 出力
    • List<SearchResult> : 検索結果をリスト型のSearchResultクラスに格納します。

xlsxワークブックを開く

var wb = new XLWorkbook(xlsxFileFullPath)

XLWorkbook関数にxlsxファイルパスを入力して、ワークブックオブジェクト(wb)を取得します。

ワークシートを1つずつループする

foreach(var ws in wb.Worksheets){
    ...
}

ワークシートコレクションは、wb.Worksheetsで取得します。

foreach を使用して、ワークシート一つずつを wsにセットします。

ワークシート名取得

string wsName = ws.Name;

ワークシート名は ws.Name で取得できます。

終端行番号、列番号の取得

//終端行番号取得
int lastRowUsedNumber = ws.LastRowUsed().RowNumber();

//終端列番号取得
int lastColUsedNumber = ws.LastColumnUsed().ColumnNumber();

そのシートの、一番下の行と一番右の列の番号を取得します。

番号ですので、取得する型は int型です。

終端行番号は ws.LastRowUsed().RowNumber() 列番号は ws.LastColumnUsed().ColumnNumber() で取得できます。

セルの値を取得する。

今回は、文字列型として取得します。セルに計算式が入っている場合、計算結果を取得します。

ws.Cell(wRow, wCol).Value.ToString();

ws.Cellオブジェクトに、行番号と列番号をセットし、.Valueプロパティで取得します。

文字列内に指定した検索条件が含まれているか判断する

sr.cellStringValue.Contains(searchTerms)

Containsは、Stringオブジェクトに含まれているメソッドです。

String.Contains Method - Microsoft Docs

検索対象文字列.Contains(検索文字列) で 取得できます。返り値は bool 型です。

おすすめ本 c#コードレシピ集

c#コードレシピ集は、「文字列を大文字あるいは小文字に変換したい」や「Taskをキャンセルしたい」など逆引き的にコードの書き方を調べられるレシピ集です。

2021年8月に発売された本で、全部で385個のレシピが収録されています。

ジャンルは日付処理やLINQ、並列処理と非同期処理など幅広く記載されています。

Kindle対応ですので、まずはサンプルをダウンロードして何が書かれているか確認してはいかがでしょうか。

コメント

タイトルとURLをコピーしました