ClosedXMLは ExcelやWordなど、XMLドキュメントのファイルを読み書きできるオープンソースのライブラリです。
実行環境に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対応ですので、まずはサンプルをダウンロードして何が書かれているか確認してはいかがでしょうか。
コメント