Как вставить титульную страницу, за которой следует разрыв страницы, в существующий документ?

#c# #ms-word #office-interop

#c# #ms-word #office-interop

Вопрос:

Моя задача — вставить содержимое документа Word с титульной страницей в набор существующих документов Word. Все существующие документы находятся в папке ToBeProcessed, а титульная страница хранится в ее собственной папке. Процесс, который я создал, заключается в том, чтобы сохранить содержимое титульной страницы в строке, затем выполнить итерацию по списку существующих файлов, открывая каждый из них, выбирая начало документа с помощью диапазона, вставляя текст, а затем добавляя разрыв страницы.

Пока все работает так, как ожидалось, за исключением того факта, что разрыв страницы вставляется перед содержимым титульной страницы. Может кто-нибудь посоветовать, как этого добиться? Я включил полное содержимое моей программы на случай, если у кого-то есть опыт достижения того же результата более эффективным способом, но, судя по моим исследованиям, использование range представляется наилучшей практикой.

         const string COVERING_FOLDER = @"C:Usersalex.grimsley1DocumentsDocmanLettersCoveringPage";
        const string COMPLETE_FOLDER = @"C:Usersalex.grimsley1DocumentsDocmanLettersComplete";
        const string LOG_FOLDER = @"C:Usersalex.grimsley1DocumentsDocmanLettersLog";

        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss"));
            StreamWriter logfile = new StreamWriter(LOG_FOLDER   @"Log_"   DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss")   @".txt");
            
            //Returns an array of strings which contains the list of filenames to be edited
            var files = Directory.GetFiles(PROCESSING_FOLDER);

            //Creates a new Application wrapper
            Application ap = new Application();

            //Open the Covering Page document
            var cp = ap.Documents.Open(COVERING_FOLDER   "\CoveringPage.docx");

            //Copy the Covering Page contents to a variable for later use
            var cpContent = cp.Content.Text;

            //Close the Covering Page document
            cp.Close(WdSaveOptions.wdDoNotSaveChanges);

            //Loop through the file list
            foreach(var file in files)
            {
                if(file.Substring(0, PROCESSING_FOLDER.Length   1) == PROCESSING_FOLDER   "~")
                {
                    Console.WriteLine("Skipping temporary file: "   file);
                } else
                {
                    try
                    {
                        object missing = System.Type.Missing;
                        
                        //Open each file using the Application wrapper
                        var d = ap.Documents.Open(file);
                        ap.Visible = true;
                        var dName = d.Name;

                        //Select a range at the very start of the Document
                        var rng = d.Range(0, 0);
                        d.Unprotect();
                        d.Protect(WdProtectionType.wdNoProtection);

                        //Add covering page text to the Document
                        rng.Text = cpContent;
                        rng.Collapse(WdCollapseDirection.wdCollapseEnd);
                        rng.InsertBreak(WdBreakType.wdPageBreak);

                        //Write the Document name to the Console
                        Console.WriteLine(d.Name);

                        //Save the document in place
                        d.Save();

                        //Close the document
                        d.Close(WdSaveOptions.wdDoNotSaveChanges);

                        //Move the file to the Complete folder
                        File.Move(file, COMPLETE_FOLDER   "\"   dName);

                        //Log the completion of the letter
                        logfile.WriteLine("Complete "   DateTime.Now.ToString()   " - "   d.Name);
                    }
                    catch(Exception e)
                    {
                        Console.WriteLine("There was an error: "   e.Message);

                        //Log the completion of the letter
                        logfile.WriteLine("Error "   DateTime.Now.ToString()   " - "   e.Message);
                    }
                    finally
                    {
                        // Close Word application
                        ap.Quit();
                        Marshal.ReleaseComObject(ap);
                        ap = null;
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }
                }
                           
            }

            
            Console.WriteLine("Processing complete...");
            Console.ReadLine();

        }```
  

Комментарии:

1. Вы знаете, как я бы это сделал? Откройте документ титульной страницы, вставьте разрыв страницы после его диапазона, затем вставьте документ, подлежащий обработке, после этого, затем сохраните документ cp с новым именем в папку, подлежащую обработке. Закрыть. Промойте и повторите.

2.Вы пытались rng.InsertBreak(WdBreakType.wdPageBreak); сначала затем снова выбрать начало вашего документа и затем вставить титульную страницу. В основном измените порядок вставки.