Экспорт данных из дерева C# winForms в MS-Word MergeFields
У меня есть приложение WinForm, написанное на C#, и у меня есть древовидная структура содержит файлы из каталога. Он также содержит данные о каждом файле (полный путь, время создания, размер) и выглядит так:
Я пытаюсь экспортировать эти данные в шаблон MS-Word, который выглядит следующим образом:
Моя проблема состоит в том, чтобы продублировать поля mergeFields для каждого файла и вставить свойства каждого файла (количество файлов изменяется), чтобы они выглядели так:
Это мой код:
private void btnExportWord_Click_1(object sender, EventArgs e)
{
object oMissing = Missing.Value;
Word.Application oWord = new Word.Application();
Word.Document oWordDoc = new Word.Document();
oWord.Visible = false;
oWordDoc = oWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
Object oTemplatePath = @"C:\test\MyXMLTemplate.dotx";
oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
for (int i = 0; i < treeViewXMLFiles.Nodes[0].Nodes.Count; i++)
{
string strFilename = treeViewXMLFiles.Nodes[0].Nodes[i].Text;
string strFull_path = treeViewXMLFiles.Nodes[0].Nodes[i].Nodes[0].Text;
string strCreationTime = treeViewXMLFiles.Nodes[0].Nodes[i].Nodes[1].Text;
string strSize = treeViewXMLFiles.Nodes[0].Nodes[i].Nodes[2].Text;
foreach (Word.Field myMergeField in oWordDoc.Fields)
{
Word.Range rngFieldCode = myMergeField.Code;
String fieldText = rngFieldCode.Text;
if (fieldText.StartsWith(" MERGEFIELD"))
{
Int32 endMerge = fieldText.IndexOf("\\");
Int32 fieldNameLength = fieldText.Length - endMerge;
String fieldName = fieldText.Substring(11, endMerge - 11);
fieldName = fieldName.Trim();
if (fieldName == "File_Name")
{
myMergeField.Select();
oWord.Selection.TypeText(strFilename);
}
if (fieldName == "Full_Path")
{
myMergeField.Select();
oWord.Selection.TypeText(strFull_path);
}
if (fieldName == "CreationTime")
{
myMergeField.Select();
oWord.Selection.TypeText(strCreationTime);
}
if (fieldName == "Size")
{
myMergeField.Select();
oWord.Selection.TypeText(strSize);
}
}
}
}
Object oSaveAsFile = (Object)@"C:\test\FINISHED_XML_Template.doc";
oWordDoc.SaveAs(ref oSaveAsFile, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing);
oWordDoc.Close(false, ref oMissing, ref oMissing);
oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
}
Я пытаюсь долго искать ответ, но безуспешно.
Я надеюсь, что кто-нибудь здесь может мне помочь.
1 ответ
Если дублирующиеся поля слияния в одном документе, вы должны сделать следующее:
Создайте единый целевой документ.
Загрузите шаблон с полем слияния в качестве другого документа.
в
for (int i = 0; i < treeViewXMLFiles.Nodes[0].Nodes.Count; i++)
цикл, сделайте следующее:3.1 Выберите содержимое шаблона и добавьте его в целевой документ.
3.2 Замените (!) Поля слияния в целевом документе (!) Данными текущего узла дерева. Обратите внимание, что вам нужно заменить поля в целевом документе, чтобы поля исчезли и остался только "простой" текст. Если вы этого не сделаете, цикл for снова наткнется на те же самые поля во время последующих итераций и испортит ранее скопированный контент. (Ваш код, похоже, уже выполняет замены полей должным образом.)
Любой текст, который должен появляться только один раз до или после последовательности с полями слияния (например, вводная фраза "Hello all"), должен быть добавлен к целевому документу до / после выполнения цикла for.
Хранение этих текстовых фрагментов в отдельных файлах шаблонов делает ваш код сравнительно простым, но вам придется иметь дело с тремя файлами шаблонов вместо одного. Однако после того, как вы приобрели значительный опыт программирования на C# и Word, вы можете подумать о подходе, позволяющем поддерживать только один шаблон. (Есть разные способы сделать это; например, вы можете использовать определенные стили форматирования в шаблоне, чтобы пометить содержимое, которое будет дублироваться для каждого узла древовидного представления, и содержимое, которое должно появиться только один раз в целевом документе.)