我正在尝试使用OpenXml将文件A.docx中的文本“ Veteran”替换为B.docx中的内容。如果B.docx包含文字或段落,则可以正常工作,并且可以修改A.docx文件。但是,如果B.docx包含一个表,则该代码将不起作用。
static void Main(string[] args)
{
SearchAndReplace(@"C:\A.docx", @"C:\B.docx");
}
public static void SearchAndReplace(string docTo, string docFrom)
{
List<WordprocessingDocument> docList = new List<WordprocessingDocument>();
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(docTo, true))
using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(docFrom, true))
{
var parts = wordDoc1.MainDocumentPart.Document.Descendants().FirstOrDefault();
docList.Add(wordDoc);
docList.Add(wordDoc1);
if (parts != null)
{
foreach (var node in parts.ChildElements)
{
if (node is Table)
{
ParseTable(docList, (Table)node, textBuilder);
}
}
}
}
}
public static void ParseText(List<WordprocessingDocument> wpd, Paragraph node, StringBuilder textBuilder)
{
Body body = wpd[0].MainDocumentPart.Document.Body;
Body body1 = wpd[1].MainDocumentPart.Document.Body;
string content = body1.InnerXml;
var paras = body.Elements<Paragraph>();
foreach (var para in paras)
{
foreach (var run in para.Elements<Run>())
{
foreach (var text in run.Elements<Text>())
{
if (text.Text.Contains("Veteran"))
{
run.InnerXml.Replace(run.InnerXml, content);
break;
}
}
}
}
}
public static void ParseTable(List<WordprocessingDocument> wpd, Table node, StringBuilder textBuilder)
{
foreach (var row in node.Descendants<TableRow>())
{
textBuilder.Append("| ");
foreach (var cell in row.Descendants<TableCell>())
{
foreach (var para in cell.Descendants<Paragraph>())
{
ParseText(wpd, para, textBuilder);
}
textBuilder.Append(" | ");
}
textBuilder.AppendLine("");
}
}
}
}
如何进行这项工作?有没有更好的方法来用另一个docx文件替换内容?
没有足够具体的答案,这是您通常解决此类问题的方式:
确保您了解Open XML规范和适当级别的有效Open XML标记。
w:document
,w:body
,w:p
,w:r
,w:t
,w:tbl
等,以及它们之间的关系,则没有机会。] >了解大多数与Open XML相关的代码transforms
根据您需要执行的操作,Open XML生产率工具可以帮助创建转换代码。如果您有原始文档和目标文档,则可以使用“生产力工具”来比较那些文档。这显示了标记的差异,因此您可以看到创建,删除或更改了哪些标记。它甚至显示了实现更改所需的基于Open XML SDK的代码。
在我自己的用例中,我通常更喜欢写recursive, pure functional transformations。尽管您需要围绕这个概念进行思考,但这是一种非常强大的方法。
在您的情况下,您应该:
一旦创建了至少尝试创建有效的目标Open XML标记的代码,如果您发现其他问题,您可能会再提出其他问题。