У меня есть процедура сбора данных, выполнение которой занимает около 10 секунд, затем она сохраняет данные в файл 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 требуется несколько секунд (от 5 до 10).
Я бы хотел изменить эту технику, чтобы я вызывал Excel непосредственно перед сбором данных, чтобы приложение было запущено ко времени сбора данных, а затем просто отобразил файл с данными.
Имея это в виду, вот то, к чему я изменил код, но он всегда говорит мне, что файла там нет (даже если он есть):
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"
}
}
Есть мысли? Как правильно отправить файл активному процессу?