环境:asp.net c# openxml
好的,所以我一直在阅读大量片段并尝试重新创建轮子,但我希望有人可以帮助我更快地到达目的地。我有多个文档需要合并在一起......检查......我可以用openxml sdk来做到这一点。鸟儿在歌唱,阳光明媚至今。现在我已经按照我想要的方式获得了文档,我需要搜索和替换文本和/或内容控件。
我试过使用我自己的文本 - {replace this} 但是当我查看 xml(将 docx 重命名为 zip 并查看文件)时,{ 离文本很远。所以我要么需要知道如何在文档中保护它,这样它们就不会出现分歧,要么我需要找到另一种搜索和替换的方法。
如果它是一个 xml 文件,我可以搜索/替换,但是我又回到了无法轻松组合这些文件的状态。
下面的代码......正如我所提到的......文档合并工作正常......只需要替换东西。
* 更新 * 更改了我的替换调用以跟踪标记而不是正则表达式。我现在有正确的信息,但 .Replace 调用似乎不起作用。最后四行用于验证我是否看到了正确的标签内容。我现在只想替换这些内容。
protected void exeProcessTheDoc(object sender, EventArgs e)
{
string doc1 = Server.MapPath("~/Templates/doc1.docx");
string doc2 = Server.MapPath("~/Templates/doc2.docx");
string final_doc = Server.MapPath("~/Templates/extFinal.docx");
File.Delete(final_doc);
File.Copy(doc1, final_doc);
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(final_doc, true))
{
string altChunkId = "AltChunkId2";
MainDocumentPart mainPart = myDoc.MainDocumentPart;
AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(
AlternativeFormatImportPartType.WordprocessingML, altChunkId);
using (FileStream fileStream = File.Open(doc2, FileMode.Open))
chunk.FeedData(fileStream);
AltChunk altChunk = new AltChunk();
altChunk.Id = altChunkId;
mainPart.Document.Body.InsertAfter(altChunk, mainPart.Document.Body.Elements<Paragraph>().Last());
mainPart.Document.Save();
}
exeSearchReplace(final_doc);
}
public static void GetPropertyFromDocument(string document, string outdoc)
{
XmlDocument xmlProperties = new XmlDocument();
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
{
ExtendedFilePropertiesPart appPart = wordDoc.ExtendedFilePropertiesPart;
xmlProperties.Load(appPart.GetStream());
}
XmlNodeList chars = xmlProperties.GetElementsByTagName("Company");
chars.Item(0).InnerText.Replace("{ClientName}", "Penn Inc.");
StreamWriter sw;
sw = File.CreateText(outdoc);
sw.WriteLine(chars.Item(0).InnerText);
sw.Close();
}
}
}
最佳答案
如果我没看错,您会在 .docx 中找到类似“{replace me}”的内容,然后当您循环浏览 XML 时,您会发现诸如 <t>{replace</t><t> me</><t>}</t>
之类的东西或一些类似的东西。现在,使用这样的 XML,不可能创建一个例程来替换“{replace me}”。
如果是这种情况,那么这很可能与它被视为校对错误这一事实有关。即,就 Word 而言,它拼写错误。其原因是您在 Word 中打开了文档并打开了校对。因此,文本被标记为“isDirty”并分成不同的运行。
解决此问题的两种方法是:
关于c# - YASR - 另一个搜索和替换问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5278804/