2013-12-13 6 views
1

В моем коде ниже я запускаю 2 слова. Один экземпляр, который я установил в свой «шаблон», - файл для документа слияния, который не был запущен. Другой экземпляр - для пустого документа, который я буду использовать для копирования/вставки каждой страницы из исполняемого документа слияния, а затем индивидуального сохранения документа.Скрыть шаблон Word Doc при отображении выполненного Word Doc?

Я делаю оба экземпляра Word видимыми, затем открываю свой «шаблон» и пустой документ для индивидуального сохранения с использованием каждого экземпляра. Затем я открою источник данных для операции MailMerge.

После того, как я Выполнить операцию почты Merge, я остался с 3 документа видны на моем экране:

  1. оригинальный «шаблон» для слияния
  2. Пустой документ, я использовал для отдельного файла сохранение при копировании/вставке разделов слияния.
  3. Выполненный документ слияния под названием «Form Letters1».

Мой код обрабатывает цикл while() и копирует каждый раздел «Form Letters1» и вставляет его в мой документ под названием «NewDocument.doc». Мой цикл foreach() затем обновляет таблицу отслеживания базы данных перед генерированием имени файла «NewDocument.doc» и сохраняет ее.

После того, как отдельный раздел из «Форм-букв1» сохранен, я выбираю все в новом сохраненном документе и очищаю его для обработки следующего раздела в «Форма письма1».

Когда все отдельные разделы «Form Letters1» были скопированы/вставлены и сохранены как их собственный документ, я скрою свой «NewDocument.doc» с помощью oNewWord.Visible = false;.

Моя проблема здесь в том, что на экране я все еще показываю документ «шаблона» для слияния почты, а также выполненный «Form Letters1» выполненный документ слияния.

Есть ли способ скрыть шаблон и оставить «Form Letters1» видимым? Я попытался установить oWord.Visible = false; перед тем, как появится мое окно сообщения, но это скрывает как «шаблон», так и «Form Letters1» (выполненный документ слияния, который я должен разрешить пользователям просматривать и распечатывать).

public void MergeSplitAndReview() 
    { 
     try 
     { 
      //MergeDocLibrary mdl = new MergeDocLibrary(); 
      //mdl.mergeDocument(docSource, docLoc); 

      // Mail Merge Template 
      Word.Application oWord = new Word.Application(); 
      Word.Document oWrdDoc = new Word.Document(); 
      // New Document Instance 
      Word.Application oNewWord = new Word.Application(); 
      Word.Document oNewWrdDoc = new Word.Document(); 

      object doNotSaveChanges = Word.WdSaveOptions.wdDoNotSaveChanges; 

      // Documents must be visible for code to Activate() 
      oWord.Visible = true; 
      oNewWord.Visible = true; 

      Object oTemplatePath = docLoc; 
      Object oMissing = System.Reflection.Missing.Value; 

      // Open Mail Merge Template 
      oWrdDoc = oWord.Documents.Open(oTemplatePath); 

      // Open New Document (Empty) 
      // Note: I tried programmatically starting a new word document instead of opening an exisitng "blank", 
      //  bu when the copy/paste operation occurred, formatting was way off. The blank document below was 
      //  generated by taking a copy of the FullMailMerge.doc, clearing it out, and saving it, thus providing 
      //  a kind of formatted "template". 
      string newDocument = projectDirectory + "\\NewDocument.doc"; 
      oNewWrdDoc = oNewWord.Documents.Open(newDocument); 

      // Open Mail Merge Datasource 
      oWrdDoc.MailMerge.OpenDataSource(docSource, oMissing, oMissing, oMissing, 
       oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing); 

      // Execute Mail Merge (Opens Completed Mail Merge Documents Titled "Letters1") 
      oWrdDoc.MailMerge.Execute(); 

      // Save the processed Mail Merge Document for Archiving 
      // oWord.ActiveDocument.SaveAs2(docTempDir + "FullMailMerge.doc"); 

      int docCnt = oWord.ActiveDocument.Sections.Count - 1; 
      int cnt = 0; 
      while (cnt != docCnt) 
      { 
       cnt++; 
       string newFilename = ""; 

       // Copy Desired Section from Mail Merge 
       oWord.ActiveDocument.Sections[cnt].Range.Copy(); 
       // Set focus to the New Word Doc instance 
       oNewWord.Activate(); 
       // Paste copied range to New Word Doc 
       oNewWord.ActiveDocument.Range(0, 0).Paste(); 

       foreach (ListViewItem lvI in lvData.Items) 
       { 
        if (lvI.Checked) // Get first checked lvI in lvData to use for generating filename 
        { 
         updateAddrChngHistory(lvI.SubItems[16].Text); 

         string fileSys = lvI.SubItems[12].Text.ToUpper(); 
         string memNo = lvI.SubItems[0].Text; 

         newFilename = fileSys + "%" + memNo + "%" + "" + "%" + "" + "%" + "CORRESPONDENCE%OUTGOING - ACKNOWLEDGEMENT%" + DateTime.Now.ToString("yyyy-MM-dd-hh.mm.ss.ffffff") + ".doc"; 

         lvI.Remove(); // Delete from listview the lvI used for newFilename 
         break;  // Break out of foreach loop 
        } 
       } 

       // Save New Word Doc 
       oNewWord.ActiveDocument.SaveAs2(docTempDir + newFilename); 
       // Clear New Word Doc 
       oNewWord.ActiveDocument.Content.Select(); 
       oNewWord.Selection.TypeBackspace(); 
      } 
      // Show only the Full Mail Merge Doc. Have user press OK when finished to close documents. 
      // Set 'False' in PROD, 'True' in DEV 
      // oWord.Visible = false; 
      // Hides my new word instance used to save each individual section of the full Mail Merge Doc 
      oNewWord.Visible = false; 
      MessageBox.Show(new Form() { TopMost = true }, "Click OK when finsihed."); 

      oNewWord.ActiveDocument.Close(doNotSaveChanges); // Close the Individual Record Document 
      oNewWord.Quit();         // Close Word Instance for Individual Record 
      oWord.ActiveDocument.Close(doNotSaveChanges); // Close the Full Mail Merge Document (Currently ALSO closes the Template document) 
      oWord.Quit(doNotSaveChanges);     // Close the Mail Merge Template 
      MessageBox.Show("Mail Merge Completed, Individual Documents Saved, Instances Closed."); 
     } 
     catch (Exception ex) 
     { 
      LogException(ex); 
      MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data); 
      // Close all Word processes 
      Process[] processes = Process.GetProcessesByName("winword"); 
      foreach (var process in processes) 
      { 
       process.Close(); 
      } 
     } 
     finally 
     { 

     } 
    } 

ответ

1

Вы должны быть в состоянии показать/скрыть отдельные документы, используя, e.g.the эквивалент следующей VBA:

oWord.ActiveDocument.Windows(1).Visible = false 

(подставляя соответствующий объект документа вместо ActiveDocument).

+0

Спасибо. Я попробую, когда у меня будет время завтра. На данный момент я закончил просто закрытие всех документов, когда обработка была закончена, а затем оставил один экземпляр, запускающий повторное открытие сохраненного полного слияния для отображения. –

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