QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

【C#】Excelファイルの起動

初歩的な質問で申し訳ありませんが、どうか宜しくお願い致します。

エクセルでテンプレート(フォーマット)を作成し、
そのエクセルファイルにCSVの情報を貼り付けたいのですが、
自分で作成したその既存のエクセルファイルをどうやって起動させたらよいのかがわかりません。
新規にExcelを起動させる方法はわかったのですが。

Excel.Application app;
Excel.Workbooks books;
Excel._Workbook book;

Excel.Application app = new Excel.Application();
Excel.Workbooks books = (Excel.Workbooks)app.Workbooks;

books.OpenText("C:\xxxx\yyyy\zzzz.csv",
         Excel.XlPlatform.xlWindows, 1,
         Excel.XlTextParsingType.xlDelimited,
         Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
         false, false, false, true,false,false,
         Missing.Value,Missing.Value, Missing.Value,
         Missing.Value,Missing.Value);

book = app.ActiveWorkbook;

book.SaveAs("C:\xxxx\yyyy\zzzz.csv",
       Excel.XlFileFormat.xlWorkbookNormal,
       Missing.Value, Missing.Value, Missing.Value, Missing.Value,
       Excel.XlSaveAsAccessMode.xlNoChange,
       Missing.Value,Missing.Value,Missing.Value, Missing.Value);

book.Close(false, Missing.Value, Missing.Value);
app.Quit();
(参照:http://support.microsoft.com/default.aspx?scid=KB;JA;306023)

ファイル名を指定して起動させたりするにはどうすればよいのでしょうか。
宜しくお願い致します。

質問者:タマ

回答

小野@EACさんの書き込み (2003-12-01 11:31) より:

拡張子にアプリケーションが関連づけされている場合は

System.Diagnostics.Process.Start

あたりで起動できると思います。

 あれ?そっちですか?アプリケーションの中で、テンプレートファイルを読み込んで、そこにCSVファイルの内容を転記し、保存して終了する、だと思ったのですが。。。

投稿者:Jitta

編集 履歴 (0)

小野@EACさん
ありがとうございます。
Excelファイルを無事起動することができました。

Jittaさん
個人的には
1.Excelで元となるシート(.xls)を作っておいて、
  それにCSVデータを貼り付けて別名で保存する。
2.テンプレートファイル(.xlt)を作っておいて、
  それにデータを貼り付けて.xlsで保存する。

という2通りの方法を考えていたんですが、どちらが良いんでしょうか。
どういう違いがあるのでしょうか。Excelのことが全然わかってないので
違いがよくわかりません。
テンプレートファイルを読み込む方法だと、どのようにすればよいのでしょうか。
宜しくお願い致します。

投稿者:タマ

編集 履歴 (0)

タマさんの書き込み (2003-12-01 12:57) より:

1.Excelで元となるシート(.xls)を作っておいて、

  それにCSVデータを貼り付けて別名で保存する。

2.テンプレートファイル(.xlt)を作っておいて、

  それにデータを貼り付けて.xlsで保存する。

どういう違いがあるのでしょうか。

 どのようにエクセルを起動するか、どこで実行されるか、どのように実行されるか、で違ってきます。

 まず、CreateObjectですが、これは文字通り「オブジェクトを作る」ので、複数回コールすると、コールした数だけエクセルが起動します。

 これに対して、エクスプローラでエクセルファイルをダブルクリックすると、デフォルトではDDEという機能により、現在起動中のエクセルに対してファイルの読み込みを通知します。つまり、エクセルは1つしか起動しません。

 1つのエクセルでは、たとえ違うディレクトリにあっても同じ名前のファイルを開くことはできません。複数のエクセルで同じファイルを開くことはできますが、先に開いた方がロックをかけるので、同時に編集することはできません。

 ここで問題ですが、作成しようとしているアプリケーションは、Windowsアプリケーションでしょうか?それとも、ASP.NETを利用した、Webアプリケーションでしょうか。
 Windowsアプリケーションならば、xlsファイルを開くでかまわないでしょう。しかし、Webアプリケーションならば、テンプレートファイルにするべきです。テンプレートファイルならば、開いたファイルは全て「違う名前」の「別ファイル」になるからです。

 テンプレートファイルの開き方も、普通のエクセルファイルの開き方も同じで、bookのopenメソッド(OpenTextメソッドではない)で開きます。

投稿者:Jitta

編集 履歴 (0)

追加の質問です。宜しくお願いします。

既に起動しているExcelへの参照を得る為に下記のようにしたのですが、
Excel.Application app = (Excel.Application)Marshal.GetActiveObject(pID);
の部分で
'System.Runtime.InteropServices.COMException'というエラーが出てしまいます。

string pID = "Excel.Application";
Excel.Application app = (Excel.Application)Marshal.GetActiveObject(pID);
Excel._Workbook book = app.ActiveWorkbook;
Excel._Worksheet sheet = (Excel._Worksheet)book.ActiveSheet;
Excel.Range range = sheet.get_Range("A1", Missing.Value);
range.Value = "xxxx";

本を見て書いてみたんですが、これではダメなんでしょうか。。。

投稿者:タマ

編集 履歴 (0)

Jittaさん
ご丁寧な回答ありがとうございます。
作成しているのはWindowsアプリです。

OpenメソッドっていうのはExcel.WorkbooksのOpenメソッドですよね。

Openメソッドを使う為にはExcelインスタンスへの参照を取得しないと
始まらないと思うんですが、それが上記のように上手くいきません。

私の考えている手順としては
1.Process.StartでテンプレートとなるExcelの起動
2.その起動しているExcelへの参照を取得する
3.Openメソッドを使ってCSVファイルをブック内のシートに読み込む
4.Excelを別名で保存
これで大丈夫でしょうか?

投稿者:タマ

編集 履歴 (0)

すみません。勘違いしてました。
下の方法でうまくいきました。ありがとうございます。

Excel.Application app = new Excel.Application();
Excel.Workbooks books = (Excel.Workbooks)app.Workbooks;
//ブックにテンプレートを読み込む
Excel._Workbook book = books.Open("xxxx\yyyy\zzzz.xls",
            Missing.Value,Missing.Value,Missing.Value,
            Missing.Value,Missing.Value,Missing.Value,
            Missing.Value,Missing.Value,Missing.Value,
            Missing.Value,Missing.Value,Missing.Value);

//アクティブなシートを取得
Excel._Worksheet sheet = (Excel._Worksheet)book.ActiveSheet;
//セルに値を貼り付け
Excel.Range range = sheet.get_Range("A1", Missing.Value);
range.Value = "XXXX";

投稿者:タマ

編集 履歴 (0)

度々スミマセン(−−;

テンプレートは起動できたんですが、CSVの情報を
どうやって貼り付けていいのか。。。

いちいちセルごとに貼り付けるのもどうかと思って。
貼り付け開始の行と列を指定して貼り付けられる方法はないでしょうか。

↓の方法で上手くいくと思ったんですが、シートには何の変化もありません。
しかもこれだと開始行しか指定できなさそうなんです。

books.OpenText("xxxx\yyyy\zzzz.csv",
         Excel.XlPlatform.xlWindows, 6,
         Excel.XlTextParsingType.xlDelimited,
         Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
         false, false, false, true,false,false,
         Missing.Value, Missing.Value, Missing.Value,
         Missing.Value, Missing.Value);

投稿者:タマ

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。