2009-08-20 7 views
0

J'ai une routine de collecte de données qui prend environ 10 secondes pour exécuter, il enregistre les données dans un fichier CSV:processus de démarrage - puis ajouter ultérieurement (MS Excel Exemple)

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 prend quelques instants pour commencer aussi (5 à 10).

Je voudrais modifier cette technique pour que j'appelle Excel juste avant ma collecte de données afin que l'application soit en cours d'exécution au moment où j'ai recueilli les données, puis il suffit d'afficher le fichier avec les données.

Dans cet esprit, voici ce que j'ai modifié le code, mais il me dit toujours que le fichier est pas là (même si elle est):

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

Toute pensée? Comment envoyer correctement le fichier au processus actif?

Répondre

2

Vous ne pouvez pas spécifier startInfo après le démarrage du processus. StartInfo est pour démarrer le processus.

Vous pourriez être en mesure de faire ce que vous voulez partir BYB Excel à l'aide Process.Start(), puis après collecte de données, à l'aide Excel automation dire Excel pour ouvrir un fichier particulier.

// 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

Voilà comment c'est fait. :) Certains m'ont dit d'éviter l'automatisation Excel si je le pouvais puisque les versions de MS Office changent aussi rapidement que les versions VS - et elles ne sont pas garanties d'être compatibles. Je viens juste de passer du temps à regarder vos autres posts. J'ai particulièrement aimé "circulaire buffer" et "Thread.Start -vs- Thread.Pool". J'ai regardé "VS2010 vs VS2008" et me suis senti humilié. Je n'ai pas encore utilisé tout le potentiel des génériques, introduit avec VS2005. J'aurais aimé avoir un moyen de me forcer à utiliser les technologies les plus récentes. Juste une solution ... – jp2code

+0

Comme une solution brute à mon dilemme, je pourrais envisager d'appeler deux routines de démarrage de thread: Start.Process ("Excel"), faire mes routines de collecte de données, puis appelez Start.Process ("Excel" , fichier). ... ou peut-être que je vais utiliser ce que vous avez là-haut. Beaucoup de paramètres, cependant. (Nouveau sur StackOverflow) Comment faire pour que la mise en forme fonctionne sur mes commentaires? Dois-je inclure manuellement une sorte de retour chariot? – jp2code

+0

Je ne pense pas que le formatage fonctionne dans les commentaires. Vous pouvez obtenir l'italique et gras, mais c'est à peu près tout. Pas de sauts de ligne. Sur les préoccupations que vous avez avec l'automatisation Excel, cela dépend. Vous pouvez regarder d'autres questions sur ce sujet. Je crois comprendre qu'Excel est rétrocompatible. La version Excel peut changer, mais l'ancien assembly Interop fonctionnera avec la nouvelle version. – Cheeso

Questions connexes