Pregunta

Tengo una rutina de recolección de datos que tarda unos 10 segundos para correr, entonces guarda los datos en un archivo 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 toma unos minutos para comenzar así (5 a 10).

Me gustaría modificar esta técnica por lo que llamo Excel justo antes de mi colección de datos por lo que la aplicación se ejecuta en el momento en que he recogido los datos, a continuación, sólo tengo que visualizar el archivo con los datos.

Con esto en mente, aquí es lo que he modificado el código para, pero siempre me dice que el archivo no está allí (aunque es):

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

¿Alguna idea? ¿Cómo iba a enviar el archivo correctamente para el proceso activo?

¿Fue útil?

Solución

No se puede especificar el startInfo después de que el proceso se ha iniciado. StartInfo es para iniciar el proceso.

Usted puede ser capaz de hacer lo que quiera byb iniciar Excel usando Process.Start(), y después después recolección de datos, usando Excel automatización decirle a Excel para abrir un archivo en particular.

// 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top