Question

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:

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 et (5 à 10).

Je voudrais modifier cette technique pour que j'appelle Excel juste avant ma collection de données pour l'application en cours d'exécution au moment où je l'ai recueilli les données, puis ai juste 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"
  }
}

Toutes les pensées? Comment puis-je envoyer correctement le fichier au processus actif?

Était-ce utile?

La solution

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

Vous pouvez être en mesure de faire ce que vous voulez partir BYB Excel à l'aide Process.Start(), puis après collecte de données, en utilisant Excel automation pour 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top