C# Wordファイルから文章データを取得
いつもお世話になっております。
只今、Wordの中身をリッチテキストボックスに取得しようとしています。
取得したデータを他の形式に変更するので、中身を編集というのはしない予定です。
取り込むこと自体はできるようになりまして
なんとかなるかなと思っていたのですが、動作を確認していると
どうも大きなファイルだと上手くいかないのです。
十数ページなら何とかいけても、数十ページだとエラーが出ます。
そこで質問です。
1:考えられる原因にはどんなものがあるでしょうか
クリップボードを利用してるので、そこが怪しいですが
ほかにありましたらお願いします。
2:解決する方法にはどんなものがあるでしょうか?
3:この方法以外にWordのデータを取得する方法はあるでしょうか?
(クリップボードを利用する以外の方法)
ソースは以下のように記述しました。
---------------------------------
Type wt = Type.GetTypeFromProgID("Word.Application");
Object wApp = Activator.CreateInstance(wt);
try
{
Object tmpDoc = wApp.GetType().InvokeMember("Documents", BindingFlags.GetProperty, null, wApp, null);
object[] tmpFile = {
fileName,
false,
true,
false,
Type.Missing,
Type.Missing,
true,
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
false,
true,
Type.Missing,
true,
Type.Missing
};
Object wDoc = tmpDoc.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, tmpDoc, tmpFile);
Object activeW = wDoc.GetType().InvokeMember("ActiveWindow", BindingFlags.GetProperty, null, wDoc, null);
Object activeWSelection = activeW.GetType().InvokeMember("Selection", BindingFlags.GetProperty, null, activeW, null);
activeWSelection.GetType().InvokeMember("WholeStory", BindingFlags.InvokeMethod, null, activeWSelection, null);
activeWSelection.GetType().InvokeMember("Copy", BindingFlags.InvokeMethod, null, activeWSelection, null);
//クリップボードの中身取得
IDataObject data = Clipboard.GetDataObject();
//リッチテキストボックス(rTextにデータを挿入)
rText.Rtf = data.GetData(DataFormats.Rtf).ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
Object apApp = wApp.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, wApp, null);
apApp.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, apApp, new object[] { Type.Missing, Type.Missing, Type.Missing });
}
---------------------------------
あちこち参考サイトを見て回っているのですが
捜し方が悪いのか、クリップボードを利用する方法以外が見つかりません。
わかる方がいましたら、よろしくお願いします。
開発環境:VisualStudio2008
実行環境:Vista
Word:*.doc/*.docx
お礼
ありがとうございます。 STAThread属性を付けたら動作しました。 フォームアプリはあらかじめついているので そのまま動作したようです。