Word查和替换字符串⽅法
因为项⽬需要通过word模板替换字符串,来让⽤户下载word,就在⽹上了word查替换字符串的库或⽅法,基本上不是收费,就是⽆实现,或者⽅法局限性太⼤
.docx 是通过xml来存储⽂字和其他信息的,有时候⼀个单词表⾯上看到的是⼀个元素,其实内部分裂成了好多元素,就像下⾯代码,在word⽂档中我们看到的是 abcdefgh,其实是这样存储的
<run>
<text>ab</text>
<text>c</text>
</run>
<run>
<text>d</text>
<text>e</text>
</run>
<run>
<text>fgh</text>
</run>
我们要查替换上⾯代码中的 bcdef 就不是简单的place 了,⽹上到了⼏个⽅法都要求 bcdef在⼀个<text>⾥⾯或者⼀个<run>⾥⾯才可以,局限性⽐较⼤。索性就⾃⼰写了⼀个⽅法
//⽤于存放多个Text相加之后的尾部和替换字符串头部重叠的Text集合
static List<Text> list = new List<Text>();
private static void Replace(OpenXmlElement parent, string old, string value)
{
foreach (var child in parent.ChildElements)
{
//如果是新的段落清空list
if (child is Paragraph)
list.Clear();
//如果是Text
if (child is Text t)
{
//Text⾃⾝包含old字符串,直接替换
if (t.Text.Contains(old))
t.Text = t.Text.Replace(old, value);
//把⾃⾝先放⼊list
list.Add(t);
/
/list 中Text元素相加的string
var text = string.Join("", list.Select(m => m.Text));
//是否包含旧字符串
var index = text.IndexOf(old);
//Text和前⾯的Text元素(⼀个或多个)相加包含old字符串
if (index >= 0)
{
//list第⼀个元素删除旧字符串的的部分并加上新字符串
list[0].Text = text.Substring(0, index) + value;
//list最后⼀个元素删除旧字符串的的部分
t.Text = text.Substring(index + old.Length);
/
/list其他元素全部替换为空
for (int i = 1; i < list.Count - 1; i++)
list[i].Text = "";
//清空list
list.Clear();
}
//Text与前⾯Text元素相加的尾部和 old字符串开头有重叠
var str = GetSamePart(text, old);
//newList
var newList = new List<Text>();
//list中的Text相加结尾和old字符串有重合的的部分,所引⽤的list 加⼊ newlist
for (int i = 0; i < list.Count; i++)
{
文档字符串是什么if (string.Join("", newList.Select(m => m.Text)).Length >= str.Length)
break;
newList.Insert(0, list[list.Count - i - 1]);
}
//list 变成新list
list = newList;
}
//递归调⽤
Replace(child, old, value);
}
}
//获取前⼀个字符结尾和后⼀个字符串开头重合的部分
public static string GetSamePart(string text, string tempalte)
{
for (int i = 1; i < tempalte.Length; i++)
{
var str = tempalte.Substring(0, tempalte.Length - i);
if (text.EndsWith(str))
return str;
}
return"";
}
使⽤⽅法如下
using var fs = File.OpenRead("xx.docx");
var ms = new MemoryStream();
await fs.CopyToAsync(ms);
using WordprocessingDocument doc = WordprocessingDocument.Open(ms, true);            Body body = doc.MainDocumentPart.Document.Body;
Replace(body, "bcdef", "1234");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。