Squeak.ru - шаблоны программирования

Скрыть шаблон Word Doc при отображении выполненного Word Doc?

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

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

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

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

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

После сохранения отдельного раздела из «Form Letters1» я выделяю все во вновь сохраненном документе и очищаю его для обработки следующего раздела в «Form Letters1».

Когда все отдельные разделы «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

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

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

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

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

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...