- PR -

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

投稿者投稿内容
タマ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2003-12-01 10:53
初歩的な質問で申し訳ありませんが、どうか宜しくお願い致します。

エクセルでテンプレート(フォーマット)を作成し、
そのエクセルファイルに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)

ファイル名を指定して起動させたりするにはどうすればよいのでしょうか。
宜しくお願い致します。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-12-01 11:31
拡張子にアプリケーションが関連づけされている場合は
System.Diagnostics.Process.Start
あたりで起動できると思います。

[参考]
http://homepage3.nifty.com/dotnetfan/console/console16.html
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-01 12:21
引用:

小野@EACさんの書き込み (2003-12-01 11:31) より:
拡張子にアプリケーションが関連づけされている場合は
System.Diagnostics.Process.Start
あたりで起動できると思います。


 あれ?そっちですか?アプリケーションの中で、テンプレートファイルを読み込んで、そこにCSVファイルの内容を転記し、保存して終了する、だと思ったのですが。。。
タマ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2003-12-01 12:57
>>小野@EACさん
ありがとうございます。
Excelファイルを無事起動することができました。

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

という2通りの方法を考えていたんですが、どちらが良いんでしょうか。
どういう違いがあるのでしょうか。Excelのことが全然わかってないので
違いがよくわかりません。
テンプレートファイルを読み込む方法だと、どのようにすればよいのでしょうか。
宜しくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-01 13:44
引用:

タマさんの書き込み (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メソッドではない)で開きます。
タマ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2003-12-01 13:50
追加の質問です。宜しくお願いします。

既に起動している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";

本を見て書いてみたんですが、これではダメなんでしょうか。。。
タマ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2003-12-01 15:00
Jittaさん
ご丁寧な回答ありがとうございます。
作成しているのはWindowsアプリです。

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

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

私の考えている手順としては
1.Process.StartでテンプレートとなるExcelの起動
2.その起動しているExcelへの参照を取得する
3.Openメソッドを使ってCSVファイルをブック内のシートに読み込む
4.Excelを別名で保存
これで大丈夫でしょうか?
タマ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2003-12-01 15:19
すみません。勘違いしてました。
下の方法でうまくいきました。ありがとうございます。

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";

スキルアップ/キャリアアップ(JOB@IT)