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

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

ClosedXML ロゴ

https://github.com/ClosedXML/ClosedXML

実行環境に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 型です。

速攻でメモできる QuickNote リリースしました!

QuickNoteは動作が超軽量でサクサクかけるノートアプリです。一瞬の閃きを逃さずにノートを開き書き始めることができます。 アカウント登録も不要です。お試しあれ!

Excel操作をコマンドで! proBoarderExcel

Excelはマウスで操作するのが基本ですが、マウス操作に疲れてはいませんか? キーボードでExcel操作ができるようになるアプリです。オープンソースで無料です。

積み上げ! Daily Stack リリースしました!

Daily Stack は日々の積み上げを管理するToDoアプリです。過去の積み上げの振り返りだけでなく、ツイート機能もあります。 アカウント登録不要ですぐに使い始めることができます。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱