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