2009-08-20 4 views
0

У меня есть сбор данных процедура, которая занимает около 10 секунд для запуска, то она сохраняет данные в файл CSV:Начало процесса - а затем добавить к нему позже (MS Excel пример)

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

Любые мысли? Как правильно отправить файл в активный процесс?

ответ

2

Вы не можете указать startInfo после того, как процесс был запущен. StartInfo предназначен для запуска процесса.

Вы можете быть в состоянии сделать то, что вы хотите BYB начиная с Excel с помощью Process.Start(), а затем после сбора данных, используя Excel automation сказать Excel, чтобы открыть конкретный файл.

// 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); 
+0

Так вот как это делается. :) Мне сказали некоторые, чтобы избежать автоматизации Excel, если можно, так как версии MS Office меняются так же быстро, как версии VS, и они не гарантированно совместимы. Я просто потратил некоторое время, глядя на ваши другие сообщения. Мне особенно понравились «круговой буфер» и «Thread.Start -vs- Thread.Pool». Я посмотрел «VS2010 против VS2008» и почувствовал себя униженным. Я еще не использовал весь потенциал дженериков, представленный с VS2005. Мне хотелось, чтобы у меня был способ заставить себя использовать новейшие технологии. Just rambling ... – jp2code

+0

Как грубое решение моей дилеммы, я мог бы рассмотреть вызов двух процедур запуска потока: Start.Process («Excel»), выполнить мои процедуры сбора данных, а затем вызвать Start.Process («Excel») , файл). ... или, может быть, я буду использовать то, что у вас там есть. Однако множество параметров. (Новое в StackOverflow) Как получить форматирование для работы с моими комментариями? Должен ли я вручную включать какой-то возврат каретки? – jp2code

+0

Я не думаю, что форматирование работает в комментариях. Вы можете получить курсив и смело, но это все. Нет строк. От проблем, которые вы испытываете при автоматизации Excel, все зависит. Вы можете посмотреть другие вопросы по этой теме. Я понимаю, что Excel обратно совместим. Версия Excel может измениться, но старая сборка Interop будет работать с новой версией. – Cheeso

 Смежные вопросы

  • Нет связанных вопросов^_^