Avviare il processo - quindi aggiungere in un secondo momento (MS Excel Esempio)
-
19-09-2019 - |
Domanda
Ho una routine di raccolta di dati che richiede circa 10 secondi per l'esecuzione, poi salva i dati in un file 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 richiedono solo pochi secondi per iniziare così (da 5 a 10).
Mi piacerebbe modificare questa tecnica in modo che io chiamo Excel poco prima che la mia collezione di dati per cui l'applicazione sarà in esecuzione con il tempo ho raccolto i dati, quindi appena l'ho visualizzare il file con i dati.
Con questo in mente, ecco cosa ho modificato il codice per, ma mi dice sempre il file non è lì (anche se è):
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"
}
}
Qualche idea? Come faccio a inviare correttamente il file per il processo attivo?
Soluzione
Non è possibile specificare lo startInfo dopo aver avviato il processo. StartInfo è per iniziare il processo.
Si può essere in grado di fare ciò che si vuole a partire byb Excel utilizzando Process.Start()
, e quindi dopo di raccolta dei dati, utilizzando Excel automazione dire Excel per aprire un determinato file.
// 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);