• 締切済み

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

  • tasoh
  • お礼率87% (65/74)

みんなの回答

  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.1

検証したわけではないのですが、下記の方法で読み込む場合はどうでしょう? DOBON.NET > プログラミング道 > .NET Tips > コントロール * 複数のRTFファイルを連結してRichTextBoxに表示する http://dobon.net/vb/dotnet/control/combinertffiles.html

tasoh
質問者

お礼

お礼が遅くなってすみません。 回答ありがとうございます。 参考URL見させていただきました。 うーん、これは別ファイルを取り込んでいるように見えますが、違うのでしょうか・・・ 1つのファイル内にある、複数ページにわたるテキストを取り込みたいと考えているのですが・・・ もう少し調べてみます。 また何か方法がありましたらよろしくお願いします。

関連するQ&A

  • C# Excelを遅延バインディングで操作する方法

    いつもお世話になっております 只今C#でExcelファイルを出力するプログラムを作成しています。 以前やり方が分からずここに質問し、なんとかExcelに出力できるようになったのですが Excelのバージョンが2007にしか対応していないことが分かり 遅延バインディング仕様に作り変えている最中です。 ところが、あと少しというところでクリアできない問題が2つ出てきたので、質問させていただきます。 1つは枠線を引く処理です。現在以下のように記述していますが どうしても例外が発生してしまいます(0x800A03EC) Type line = Type.GetTypeFromProgID("Excel.XlLineStyle.xlContinuous"); Type insidevertical = Type.GetTypeFromProgID("Excel.XlBordersIndex.xlInsideVertical"); Object tempA = objRange.GetType().InvokeMember("Borders", BindingFlags.GetProperty, null, objRange, null); Object tempB = tempA.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, tempA, new object[] { insidevertical }); tempB.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null, tempB, new object[] { line }); これがどう解決していいかわかりません・・・ 遅延バインディングという手法も最近知ったばかりで、見よう見まねという状況です。 2つ目は、ファイル保存時の拡張子です。 現在は以下のように記述しています (問題なく動作はしてくれます) object[] mySave ={strFileName,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing}; objBook.GetType().InvokeMember("SaveAs", BindingFlags.InvokeMethod, null, objBook, mySave); 以前はこのようにしていました objBook.SaveAs(strFileName,      Excel.XlFileFormat.xlExcel8,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Excel.XlSaveAsAccessMode.xlNoChange,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing,      Type.Missing); 保存する拡張子をxlsに統一したいのですが、遅延にした場合のファイル形式の指定方法がわかりません Type.Missingにすると、実行環境にあるものに合わせた拡張子で保存されてしまい Excel2007を使用している環境ではxlsxのファイルを作ってしまいます。 Type exFormat = Type.GetTypeFromProgID("Excel.XlFileFormat.xlExcel8"); のような感じで使えるかとも思ったのですが、できませんでした。。 わかる方がいましたら、よろしくお願いします。 開発環境   Vista   VisualStudio2008   .NET Framework 3.5

  • InvokeMemberメソッドとは何をするメソッドでしょうか?

    はじめまして、質問です。 C#のソースコードで、「Type.InvokeMember メソッド」というのを使っている箇所があるのですが、 これがいったい何をするメソッドなのかよく分かりません。 msdnのヘルプでは、 「指定したバインディング制約を使用し、指定した引数リストと照合して、指定したメンバを呼び出します。 」 と言っていますが、知識不足で理解できていません。 ネットで検索しても参考になりそうなものが引っかからない状況です。 実際に使用している箇所のソースコードは以下のような感じです。 private void axWebBrowser1_NavigateComplete2(object sender, AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event e) { Object o = e.pDisp; Object oDocument = null; oDocument = o.GetType().InvokeMember("Document",BindingFlags.GetProperty,null,o,null); o.GetType().InvokeMember("Application",BindingFlags.GetProperty,null,oDocument,null); 中略 } ご存知の方がいらっしゃいましたら宜しくお願い致します。 何か参考になるURLや、このように調べるべきだなどのアドバイスなどもありましたら、 ぜひお願い致します。

  • C#で配列のフィールドを取得したい

    C#2.0を試用しています。 次のような書き方ではプリミティブ型は取得できるのですが、 配列のフィールドは取得できないので、 なんとかして取得する方法はないのでしょうか? public class MasterClass {  public int a = 2;  public int[] b = new int[] { 1, 2 };//←取得できない } Object obj = new TestClass(); Type type = obj.GetType(); foreach (FieldInfo fi in type.GetFields()) {  object tmp = fi.GetValue(obj);  Console.WriteLine(fi.Name + ":" + tmp); } System.Console.ReadLine();

  • C#の動的キャスト

    いつもお世話になっています。 C#の動的キャストに関する質問です。 C#のメソッドにobjectの引数を渡して動的にキャストする場合 void Hoge(object obj) { Type t = Type.GetType(obj); objの型 obj2 = (objの型)Convert.ChangeType(obj, t); //(1) ................................. } のようにされています。 しかし多様性をもつobjcetを引数にする多くの場合は「objの型」は不定です。 逆に言えば「objの型」がわかっている場合はわざわざobjectを引数にする必要はないわけです。 そこで質問ですが、何とかType t から「objの型」を取得して(1)記法による動的キャストを行う方法はないでしょうか? GetMethod, GetPropertyでメソッド,プロパティを取得し、Invoke, GetValue, SetValueすることは可能ですが、できればドット記法(.)が使える (1) のような動的キャストを行いたいと考えています。 よろしくお願いします。

  • C# accessデータ取得 メモ型が途切れる

    お世話になっております。 accessのデータをC#で取得して、それを加工して csvに出力するプログラムを作っています。 SQLで取得して、OleDA.Fill(dataSetItem, "item"); とした後、dataSetItemの取得したデータを見ると accessでメモ型にしていた項目の データが完全に取得できなく、途中で途切れてしまいます。 以下は設定の説明です。 accessで、文字列が長く、htmlが含まれている項目をメモ型に設定。 XMLスキーマのメモ型の項目のデータタイプはSystem.Stringです。 SQL文はデータ加工せず、「SELECT * 」で取得しています。 データタイプはSystem.String以外にObjectがありましたが 同じく取得できませんでした。 ご教授お願い致します。

  • Javaでの画面コピーの取得方法

    Javaで画面コピーを取得する方法が分かりません。 ロボットで画面コピーをクリップボードにコピーして、クリップボードから画像を取得する方法は実現できました。 Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_PRINTSCREEN); robot.keyRelease(KeyEvent.VK_PRINTSCREEN); BufferedImage image = (BufferedImage)clipboard.getContents(null);//画像データ クリップボードを経由しないで画面コピーを取得する方法はありますか?

    • ベストアンサー
    • Java
  • C#でのEXCEL出力に関して

    教えて下さい。 C#でEXCELシートにデータを出力していますが、その際に以下のような記述をした場合、 EXCELファイルは作成されるものの、そのファイルをダブルクリックで開こうとすると、 EXCELの枠だけ表示され、中身のシートが表示されない現象となってしまいます。 それらしきオブジェクトはすべて開放しているつもりですが、その事象を解決できません。 どこがおかしいか教えて頂きたいと思います。 記述に過不足あればご指摘下さい。 尚、環境は、WindowsXP Office2000-EXCEL です。 《記述内容》 ////////////////////////////////// //ここからエクセルシートへの転記// ////////////////////////////////// Excel.Application objExcel = null; Excel.Workbooks objBooks = null; Excel.Workbook objBook = null; Excel.Worksheet sheet = null; Excel.Range range1 = null; Excel.Range range2 = null; Excel.Range range3 = null; //ExcelのCOMオブジェクトの生成 objExcel = new Excel.Application(); //Excelを表示する設定 //objExcel.Visible = isVisible; //ワークブックの集合体取得 objBooks = objExcel.Workbooks; //ブックの新規作成 objBook = objBooks.Add(Missing.Value); //シートを取得 sheet = (Excel.Worksheet)objBook.Sheets.get_Item(1); //Rangeを取得 range1 = (Excel.Range)sheet.Cells[1, 1]; range2 = (Excel.Range)sheet.Cells[1, 2]; //文字列を設定 //ヘッダ書き込み range1.Value = "仕入先名"; range2.Value = "図面番号"; //エクセルシート側の行数カウント変数 int rcount = 2; //データテーブル側の行数カウント変数 int tcount = 0; for (tcount = 0; tcount < mst_cnt;tcount++ ) { range1 = (Excel.Range)sheet.Cells[rcount, 1]; range2 = (Excel.Range)sheet.Cells[rcount, 2]; range1.Value = 仕入先名[tcount]; range2.Value = 図面番号[tcount]; rcount++; } //エクセルシート削除 DeleteFile(@"c:\\" + h_no + ".xls"); //エクセルシート生成 objBook.SaveAs( "c:\\" + h_no + ".xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 0, Missing.Value, Missing.Value, Missing.Value, Missing.Value ); //COMオブジェクト解放 Marshal.ReleaseComObject(range1); Marshal.ReleaseComObject(range2); //COMオブジェクトの開放(必須) Marshal.ReleaseComObject(objBook); objBook = null; Marshal.ReleaseComObject(sheet); sheet = null; Marshal.ReleaseComObject(objBooks); objBooks = null; //System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel); objExcel.Quit(); Marshal.ReleaseComObject(objExcel); objExcel = null; //objExcel.Quit(); return; } よろしくお願いします。

  • 「クリップボードにコピーされているデータが多すぎます。」について

    大量なExcelデータを複写してAccessのテーブルに貼り付けてテーブルを 閉じたら以下のメッセージが表示されました。 「クリップボードにコピーされているデータが多すぎます。 データをクリップボードにコピーすると、オブジェクトに対する参照だけがコピーされます。 ソース ドキュメントを閉じると、ソースからすべてのデータが貼り付けられます。 データに量によっては、時間がかかる場合もあります。 このデータをクリップボードに保存しますか?」 どういう事で言っているのでしょうか? 説明して下さい。 宜しくお願いします。

  • C/C++でIEの選択範囲を取得する方法

    C/C++で、IE上で範囲選択している場合に、別のアプリケーションからその選択範囲を取得する方法をおしえてください。 今は、IEにCTRL+Cを送って、クリップボード経由で取得する方法を検討しています。 以下のようなコードで、範囲選択をしているウィンドウのタイトルは取れているのですが、クリップボードへのコピーができていません、ハンドルが違うような気がするのですが... どうすればよろしいのでしょうか?? char buf[1000]; HWND hWndFore; /* フォアグラウンドウィンドウの取得 */ hWndFore = GetForegroundWindow(); /* ウィンドウタイトルの表示 */ GetWindowText(hWndFore, buf, 1000); //MessageBox(NULL, buf, "DoGetForegroundWindow", MB_OK); keybd_event(VK_CONTROL, 0, 0, 0); keybd_event('C', 0, 0, 0); keybd_event('C', 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); よろしくお願いいたします。

  • $xml要素を階層指定して取得しようとすると、NULLになるのですが…

    $xml要素を階層指定して取得しようとすると、NULLになるのですが…。 ▽元のXMLファイル(楽天トラベルAPI) <Response> _<Body> __<KeywordHotelSearch:KeywordHotelSearch> ___<hotel> ____<hotelBasicInfo> _____<hotelNo>7531</hotelNo> _____<hotelName>パークハイアットホテル</hotelName> ▽$xml = simplexml_load_string($xml);した際の、var_dump($xml) object(SimpleXMLElement)#1 (2) { ["headerHeader"]=> object(SimpleXMLElement)#2 (3) { ["Args"]=> object(SimpleXMLElement)#4 (1) { ["Arg"]=> array(7) { [0]=> string(4) "true" [1]=> string(4) "true" [2]=> string(4) "true" [3]=> string(4) "true" [4]=> string(4) "true" [5]=> string(4) "true" [6]=> string(4) "true" } } ["Status"]=> string(7) "Success" ["StatusMsg"]=> object(SimpleXMLElement)#5 (0) { } } ["Body"]=> object(SimpleXMLElement)#3 (0) { } } object(SimpleXMLElement)#8 (0) { } この後、$items = $xml->Body->KeywordHotelSearchKeywordHotelSearch->hotel->hotelBasicInfo; とやると、$itemsが NULL になるのですが、何故でしょうか? (※KeywordHotelSearch:の:は、simplexml_load_stringする前に、str_replaceで処理済です) ちなみに、$items = $xml->Body->KeywordHotelSearchKeywordHotelSearch;では、$itemsは下記になります。 object(SimpleXMLElement)#4 (0) { }

    • ベストアンサー
    • PHP

専門家に質問してみよう