我需要在word文档中进行简单的搜索和替换字符串。我认为这很容易,但不是(至少对我而言)
查看此代码(它需要一个流,打开文档的不同部分,搜索字符串,然后替换它)。
问题是只保存MainDocumentPart和FooterPart中的内容。 HeaderPart未保存。奇怪...
public static void ProcessDocument(Dictionary<string, string> properties, Stream fs)
{
using (WordprocessingDocument doc = WordprocessingDocument.Open(fs, true))
{
string docText = null;
using (StreamReader sr = new StreamReader(doc.MainDocumentPart.GetStream()))
{
docText = sr.ReadToEnd();
}
docText = DoTheReplace(properties, docText);
using (StreamWriter sw = new StreamWriter(doc.MainDocumentPart.GetStream(FileMode.Create)))
{
sw.Write(docText);
}
foreach (FooterPart footer in doc.MainDocumentPart.FooterParts)
{
string footerText = null;
using (StreamReader sr = new StreamReader(footer.GetStream()))
{
footerText = sr.ReadToEnd();
}
footerText = DoTheReplace(properties, footerText);
using (StreamWriter sw = new StreamWriter(footer.GetStream(FileMode.Create)))
{
sw.Write(footerText);
}
}
foreach (HeaderPart header in doc.MainDocumentPart.HeaderParts)
{
string headerText = null;
using (StreamReader sr = new StreamReader(header.GetStream()))
{
headerText = sr.ReadToEnd();
}
headerText = DoTheReplace(properties, headerText);
using (StreamWriter sw = new StreamWriter(header.GetStream(FileMode.Create)))
{
sw.Write(headerText);
}
}
}
}
是的,如果有更简单的方法来替换word doc中的字符串,请告诉我。
感谢您的帮助
Larsi
答案 0 :(得分:4)
我最终使用了DocX。它是一个很棒的lib,并且有一个简单的替换功能。
答案 1 :(得分:2)
当你在部件上调用GetStream()时,我相信它会返回部件的整个XML结构,而不仅仅是文本区域。而且Microsoft Word有时会在奇怪的地方拆分单词,所以像
这样的字符串Hello World!
可能看起来像
<w:p><w:r><w:t>Hel</w:t><w:t>lo </w:t><w:t>World!</w:t></w:r><w:p>
因此,如果您尝试替换“Hello”,则可能无法通过简单的搜索和替换找到它。也许你的标题部分中的文字会以一种奇怪的方式分开。
答案 2 :(得分:2)
就像“MainDocumentPart”有一个保存方法: MainDocumentPart.Document.Save();
您还应该为标题调用Save方法: header.Header.Save();
foreach (HeaderPart header in doc.MainDocumentPart.HeaderParts)
{
string headerText = null;
using (StreamReader sr = new StreamReader(header.GetStream()))
{
headerText = sr.ReadToEnd();
}
headerText = DoTheReplace(properties, headerText);
using (StreamWriter sw = new StreamWriter(header.GetStream(FileMode.Create)))
{
sw.Write(headerText);
}
//Save Header
header.Header.Save();
}