最近有个项目,需要替换Word的模板,由于想不依赖于服务器是否安装了office,所以采用了NPOI
之前做替换,由于不涉及样式,或者是没有特殊的样式,所以直接就用XWPFParagraph对象中的ParagraphText属性直接替换文本内容,如下面代码,但是这样替换会产生一个问题,就是将原有的样式都丢失了。
foreach (var para in doc.Paragraphs)
{
string oldtext = para.ParagraphText;
if (oldtext == "")
continue;
string temptext = para.ParagraphText;
if (temptext.Contains("qShareofTransfer2"))
temptext = temptext.Replace("qShareofTransfer2", dr[0]["qShareofTransfer"].ToString());
para.ReplaceText(oldtext, temptext);
}
为了解决这个问题,在Debug过程中发现NPOI中读取文档的样式是存放在Runs里的,而且Runs里带有Word的格式,而且的Runs的Text也可以替换,于是就改成了从Runs里替换,不说了上代码
foreach (var para in doc.Paragraphs)
{
string oldtext = para.ParagraphText;
if (oldtext == "")
continue;
string temptext = para.ParagraphText;
if (para.Runs.Any())
{
foreach (var r in para.Runs)
{
if (r.Text.Contains("qShareofTransfer2"))
{
r.ReplaceText("qShareofTransfer2", dr[0]["FromCustomerIDname"].ToString());
}
}
}
}
这样替换后,模板中定好的样式是不会丢失的