سؤال

لدي روتين لجمع البيانات يستغرق تشغيل حوالي 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"
  }
}

أي أفكار؟ كيف يمكنني إرسال الملف بشكل صحيح إلى العملية النشطة؟

هل كانت مفيدة؟

المحلول

لا يمكنك تحديد startinfo بعد بدء العملية. startinfo هو بدء العملية.

قد تكون قادرا على القيام بما تريد بدء تشغيل Excel باستخدام Excel Process.Start(), ، وثم بعد جمع البيانات، باستخدام التفوق الأتمتة لإخبار 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top