2009-08-20 2 views
0

私はそれはCSVファイルにデータを保存し、実行するために約10秒かかり、データ収集ルーチンを持っている:スタートプロセス - 後でそれを(MSエクセル例)を追加

string file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Book1.csv"); 
StreamWriter streamWriter1 = new StreamWriter(File.Open(file, FileMode.Create, FileAccess.Write)); 
DataTable table = GetMyData(); // takes about 10 seconds 
foreach (DataRow row in table.Rows) { 
    object[] item = row.ItemArray; 
    for (int i = 0; i < item.Length; i++) { 
    streamWriter1.Write(item.ToString() + ","); 
    } 
    streamWriter1.WriteLine(); 
} 
streamWriter1.Close(); 
Process.Start("Excel", "book1.csv"); 

Excelがかかります始めるのに数分もかかる(5〜10)。

このテクニックを変更して、データ収集の直前にExcelを呼び出して、データを収集した時点でアプリケーションが実行されるようにしてから、データを含むファイルを表示するようにしたいと考えています。これを考慮して

は、ここで私は、コードを修正するものだが、それはいつも私にファイルを伝えます(それがあるにもかかわらず)がありません。

Process excel = Process.Start("Excel"); 
if (excel != null) { 
    string file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Book1.csv"); 
    StreamWriter streamWriter1 = new StreamWriter(File.Open(file, FileMode.Create, FileAccess.Write)); 
    DataTable table = GetMyData(); // takes about 10 seconds 
    foreach (DataRow row in table.Rows) { 
    object[] item = row.ItemArray; 
    for (int i = 0; i < item.Length; i++) { 
     streamWriter1.Write(item.ToString() + ","); 
    } 
    streamWriter1.WriteLine(); 
    } 
    streamWriter1.Close(); 
    for (int i = 0; i < 100; i++) { // simulate the data collection routine 
    Thread.Sleep(100); 
    } 
    excel.StartInfo.Arguments = file; 
    excel.StartInfo.ErrorDialog = true; 
    excel.StartInfo.UseShellExecute = false; 
    excel.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
    try { 
    excel.Start(); 
    } catch (Exception err) { 
    Console.WriteLine(err.Message); // <= Message is "The system cannot find the file specified" 
    } 
} 

任意の考えは?ファイルをアクティブなプロセスに正しく送信するにはどうすればよいですか?

答えて

2

プロセスの開始後にstartInfoを指定することはできません。 StartInfoはプロセスを開始するためのものです。

あなたは、特定のファイルを開くには、Excelを伝えるためにExcel automationを使用して、あなたはProcess.Start()を使用してExcelを起動BYBやりたいことができ、その後、後のデータの集合であってもよいです。

// connect to, or start, Excel: 
Excel.Application xl=new Excel.ApplicationClass(); 

Excel.Workbook wb = xl.Workbooks.Open(Environment.CurrentDirectory+"/SampleExcel.xls", 
             0, 
             false, 
             5, 
             System.Reflection.Missing.Value, 
             System.Reflection.Missing.Value, 
             false, 
             System.Reflection.Missing.Value, 
             System.Reflection.Missing.Value, 
             true, 
             false, 
             System.Reflection.Missing.Value, 
             false, 
             false, 
             false); 
+0

これはそれがどのように行われるかです。私はMS OfficeのバージョンがVSバージョンと同じくらい速く変わってからExcelの自動化を避けるように言われました。互換性があると保証されていません。 私はあなたの他の記事も見ていました。私は特に "循環バッファ"と "Thread.Start -vs- Thread.Pool"が好きです。私は "VS2010 VS VS2008"を見て、謙虚に感じました。私はまだVS2005で紹介されたジェネリックの完全な可能性を使用していません。私は自分に最新のテクノロジーを使用させる方法があることを望んだ。 ちょっと散歩... – jp2code

+0

私のジレンマの粗い解決策として、Start.Process( "Excel")、データ収集ルーチンを実行してStart.Process( "Excel" 、ファイル)。 ...多分私はあなたがそこにいたものを使用します。しかし、多くのパラメータ。 (StackOverflowの新機能)コメントを編集するにはどうすればよいですか?手動で何らかの復帰を行わなければならないのですか? – jp2code

+0

コメントは書式設定が機能しないと思います。イタリック体と太字を得ることができますが、それはそれです。改行はありません。 Excelの自動化に関する懸念事項は、それが依存しています。あなたはそのトピックに関する他の質問を見ることができます。私の理解は、Excelは下位互換性があるということです。 Excelバージョンは変更される可能性がありますが、古いバージョンのInteropアセンブリは新しいバージョンで動作します。 – Cheeso

関連する問題