Excelファイルからテキストを抽出する
Windows 10 / Visual Stadio Community 2019 / .NET Framework 4.7.2
Excelファイルの全文検索を行うためには、Excel形式の内部データからテキストを抽出しなくてはならない。検索時にリアルタイムでテキストの抽出を行うこと(on-the-fly)も可能だが、かなり重たい処理なので、実用的ではない。このアプリケーションでは事前に、検索対象の全ての Excelファイルからテキストの抽出を行い、ファイルに出力しておき、検索はこのファイルに対して行うという方式をとる。
テキストの抽出方法について具体的な例を示しながら解説する。以下のシートには、セル、グループ化されたテキストボックス、図形(楕円)にテキストが入力されている。
![[image5]](/dot_net/9/image5.png)
Excelファイルの操作は COMオブジェエクトを利用する
本アプリケーションは、古いタイプのExcelファイル(.xls)も対象としたいので、テキストの読み込みには Office COMオブジェエクトを使う。以下、具体的なコードに基づき解説する。
Excelアプリケーションの各要素(ファイルやシートなど)は、オブジェクトとして提供される。オブジェクトは以下のような階層を構成する。
C#プログラムで COMオブジェクトを使用するためには、ソリューションエクスプローラから以下のライブラリの参照を追加する。
シートの COMオブジェクトを取得する。オブジェクトを通してしてテキストの読み込み等の操作を行うことがっできる。
セルのテキストを読みこむ
一時ファイルを作成し、そこにSaveAsメソッドによりシートのテキストを CSV形式で書き出す。COMオブジェクトによる操作は、例えば、セルを選択する、コピーする、文字列を代入するといった Excelの UI操作を模倣する動きが多い。
前掲の Excelシートのテキストを読み込んだ結果は次の通り。複数の値を入力すると、最も左上の値のセルと、最も右下の値のセルを範囲とした表として扱われる。要素の区切りにカンマが挿入され、行ごとに改行される。空白のセルも一要素となる。例題のデータは7行 3列の表と見なされる。
図形のテキストを読み込む
図形に挿入されているテキストを読み込むには、Shapesコレクションのメンバである Shapeクラスのオブジェクを取得し TextFrame.Charactersメソッドを呼ぶ。
Shapeオブジェクには画像のようにテキストを保持できないものも含まれる。このようなオブジェクに対し上記メソッドでテキスト読み込もうとすると COMオブジェクトの中で例外が発生してしまう。これを避けるために読み込み可能なオブジェクトであるか否かを Typeプロパティの値により事前にチェックしておく必要がある。
サンプルコードでは、四角や円といったいわゆる図形とテキストボックスに対してのみテキストの読み込みを行っている。 これらがテキストを保持するのは自明だが、それ以外のオブジェクトは知らないものばかりなので、実際に Excel上で試してみて経験的に割り出すしかない。
図形はグループ化することにより任意の階層を持つことができるので、テキストを抽出する処理は再帰的なものとする。グループ化されたオブジェクは Typeプロパティにより判定することができる。
アプリケーションの解説
本アプリケーションは、下図の青枠で囲んだ部分の処理を行う。
![[image8]](/dot_net/9/image8.png)