Скопируйте шаблон страницы в конце нового документа - PullRequest
0 голосов
/ 20 марта 2019

У меня есть текстовый документ, содержащий одну страницу, которую я хотел бы использовать в качестве шаблона для создания другого текстового документа. Новый документ будет содержать несколько страниц с замененным содержимым со страницы шаблона.

**Document 1**
Page 1 (Template Page)

**Document 2**
Page 1 (Copy of Template Page)
Page 2 (Copy of Template Page)
Page 3 ...

Шаблон на данный момент содержит только строку «Test #», и я хотел бы заменить «#» номером текущей страницы. Мой текущий код выглядит следующим образом и должен создать новый документ, содержащий две страницы.

        string filename = @"C:\xxxxx_in.docx";

        Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
        Microsoft.Office.Interop.Word.Document oDoc2 = oWord.Documents.Add();

        for (int i = 1; i < 3; i++)
        {
            Microsoft.Office.Interop.Word.Document oDoc1 = oWord.Documents.Open(filename);
            object matchCase = false;
            object matchWholeWord = true;
            object matchWildCards = false;
            object matchSoundsLike = false;
            object matchAllWordForms = false;
            object forward = true;
            object format = false;
            object matchKashida = false;
            object matchDiacritics = false;
            object matchAlefHamza = false;
            object matchControl = false;
            object read_only = false;
            object visible = true;
            object replace = 2;
            object wrap = 1;
            object findText = "#";
            object replaceWithText = i.ToString();

            oDoc1.Content.Find.Execute(ref findText, ref matchCase, ref matchWholeWord,
                ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceWithText, ref replace,
                ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);

            Microsoft.Office.Interop.Word.Range oRange = oDoc1.Content;
            oRange.Copy();

            oDoc2.Range(oDoc2.Content.End - 1, oDoc2.Content.End - 1).Paste();
            oDoc1.Close();
        }


        object outputFileName = @"C:\xxxxx_out.docx";
        oDoc2.SaveAs(ref outputFileName);
        oWord.Quit();

Проблема в том, что я получаю исключение для строки ...

        oDoc2.Range(oDoc2.Content.End - 1, oDoc2.Content.End - 1).Paste();

System.Runtime.InteropService.COMException: «вызванный объект имеет отключен от своих клиентов. "

Как я могу это исправить? Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Проблема с кодом в вопросе заключается в том, что oDoc1 создается для каждого прохода через цикл.

Microsoft.Office.Interop.Word.Document oDoc1 = oWord.Documents.Open(filename);

Поместите это перед циклом for, чтобы документ открывался только один раз. Тогда oDoc1 не должно отключаться.

Лучше будет использовать Documents.Add для создания нового документа (oDoc1) из "шаблона". Таким образом, нет опасности изменения файла шаблона. Затем, чтобы повторить «пустую» страницу (содержимое до замены значений), попробуйте использовать метод Range.InsertFile, чтобы ввести содержимое «шаблона» в конце oDoc1.

0 голосов
/ 20 марта 2019

Я исправил проблему, открыв второй документ в отдельном текстовом приложении.Вот рабочий код.

        string filename = @"C:\xxxxx_in.docx";

        Microsoft.Office.Interop.Word.Application oWord1 = new Microsoft.Office.Interop.Word.Application();
        Microsoft.Office.Interop.Word.Application oWord2 = new Microsoft.Office.Interop.Word.Application();

        int pages = 3;

        try
        {
            Microsoft.Office.Interop.Word.Document oDoc2 = oWord2.Documents.Add();

            for (int i = 0; i < pages; i++)
            {
                Microsoft.Office.Interop.Word.Document oDoc1 = oWord1.Documents.Open(filename);
                object matchCase = false;
                object matchWholeWord = true;
                object matchWildCards = false;
                object matchSoundsLike = false;
                object matchAllWordForms = false;
                object forward = true;
                object format = false;
                object matchKashida = false;
                object matchDiacritics = false;
                object matchAlefHamza = false;
                object matchControl = false;
                object read_only = false;
                object visible = true;
                object replace = 2;
                object wrap = 1;
                object findText = "#";
                object replaceWithText = i.ToString();

                oDoc1.Content.Find.Execute(ref findText, ref matchCase, ref matchWholeWord,
                    ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceWithText, ref replace,
                    ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);

                Microsoft.Office.Interop.Word.Range oRange = oDoc1.Content;
                oRange.Copy();

                oDoc2.Range(oDoc2.Content.End - 1, oDoc2.Content.End - 1).Paste();

                if (i + 1 < pages)
                {
                    oDoc2.Range(oDoc2.Content.End - 1, oDoc2.Content.End - 1).InsertBreak(Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak);
                }

                oDoc1.Close(false);
            }

            object outputFileName = @"C:\xxxxx_out.docx";
            oDoc2.SaveAs(ref outputFileName);
            oDoc2.Close(false);
        }
        catch (Exception ex)
        {
            // Do something.
        }
        finally
        {
            oWord1.Quit(false);
            oWord2.Quit(false);
        }
...