#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);
сначала затем снова выбрать начало вашего документа и затем вставить титульную страницу. В основном измените порядок вставки.