使用OpenXML和c#处理word文档
本文关键字:word 文档 处理 OpenXML 使用 | 更新日期: 2023-09-27 18:08:45
所以我试图填充word文档中的内容控件,通过匹配标签并填充该内容控件中的文本。
下面的代码在MessageBox中显示了我文档中的所有标签。
//Create a copy of the template file and open the document
File.Delete(hhscDocument);
File.Copy(hhscTemplate, hhscDocument, true);
//Open the word document specified by location
using (var document = WordprocessingDocument.Open(hhscDocument, true))
{
//Change the document type from template to document
var mainDocument = document.MainDocumentPart.Document;
if (mainDocument.Body.Descendants<Tag>().Any())
{
//MessageBox.Show(mainDocument.Body.Descendants<Table>().Count().ToString());
var tags = mainDocument.Body.Descendants<Tag>().ToList();
var aString = string.Empty;
foreach(var tag in tags)
{
aString += string.Format("{0}{1}", tag.Val, Environment.NewLine);
}
MessageBox.Show(aString);
}
}
但是,当我尝试以下操作时,它不起作用。
//Create a copy of the template file and open the document
File.Delete(hhscDocument);
File.Copy(hhscTemplate, hhscDocument, true);
//Open the word document specified by location
using (var document = WordprocessingDocument.Open(hhscDocument, true))
{
//Change the document type from template to document
var mainDocument = document.MainDocumentPart.Document;
if (mainDocument.Body.Descendants<Tag>().Any())
{
//MessageBox.Show(mainDocument.Body.Descendants<Table>().Count().ToString());
var tags = mainDocument.Body.Descendants<Tag>().ToList();
var bString = string.Empty;
foreach(var tag in tags)
{
bString += string.Format("{0}{1}", tag.Parent.GetFirstChild<Text>().Text, Environment.NewLine);
}
MessageBox.Show(bString);
}
}
我的最终目标是,如果我匹配了适当的标签,我想填充/更改标签所属的内容控件中的文本。
所以我基本上使用FirstChild和InnerXml来挑选文档XML内容。在此基础上,我开发了以下代码来完成我需要的功能。
//Open the word document specified by location
using (var document = WordprocessingDocument.Open(hhscDocument, true))
{
var mainDocument = document.MainDocumentPart.Document;
if (mainDocument.Body.Descendants<Tag>().Any())
{
//Find all elements(descendants) of type tag
var tags = mainDocument.Body.Descendants<Tag>().ToList();
//Foreach of these tags
foreach (var tag in tags)
{
//Jump up two levels (.Parent.Parent) in the XML element and then jump down to the run level
var run = tag.Parent.Parent.Descendants<Run>().ToList();
//I access the 1st element because there is only one element in run
run[0].GetFirstChild<Text>().Text = "<new_text_value>";
}
}
mainDocument.Save();
}
查找文档中的所有标签,并将元素存储在一个列表
var tags = mainDocument.Body.Descendants<Tag>().ToList();
这部分代码从xml的标记部分开始。从那里,我调用parent两次以在XML代码中跳转两个级别,这样我就可以使用后代访问Run级别。
var run = tag.Parent.Parent.Descendants<Run>().ToList();
最后但并非最不重要的是,下面的代码将一个新值存储到明文内容控件的文本部分。
run[0].GetFirstChild<Text>().Text = "<new_text_value>";
我注意到的是xml层次结构是一个时髦的东西。我发现从下往上访问这些东西更容易,因此我从标签开始并向上移动。