因为项目需要通过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 就不是简单的string.replace 了,网上找到了几个方法都要求 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 "";
}

最新文章

  1. JDBC_part3_批处理_事务_元数据
  2. Android基于mAppWidget实现手绘地图(五)--如何创建地图资源
  3. iOS如何把导航默认的返回按钮设置成“返回”
  4. Ado.Net小练习01(数据库文件导出,导入)
  5. android关机充电
  6. 嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境
  7. 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)
  8. Spring测试
  9. 支付宝集成+网站支付+APP支付+手机网站支付
  10. JavaScript学习总结(一)DOM文档对象模型
  11. 【作业4.0】HansBug的第四次面向对象课程思考
  12. Linux下创建和删除软、硬链接 可临时处理空间不足
  13. Linux+eclipse+maven+tomcat7小项目实战
  14. 向Sql Server数据库插入中文时显示乱码的解决办法 (转)
  15. native与ascii互转
  16. 【LeetCode】Number of Islands
  17. kubernetes continually evict pod when node&#39;s inode exhausted
  18. Python输出字符串或文件颜色显示
  19. 《新一代视频压缩码标准-H.264_AVC》读书笔记1
  20. Spring @Transactional

热门文章

  1. python进阶(2)python最常用的模块
  2. linux系统解压命令总结
  3. 用友U8+V12.0安装教程(有需要软件和服务的可以联系我)
  4. 如何使用 Navicat Premium 的新“自动运行”工具自动运行行数据库复制。
  5. Linux下搭建ZooKeeper集群
  6. Django练习遇到的错误记录
  7. git clone 提速
  8. CVE-2017-12149-JBoss 5.x/6.x 反序列化
  9. 为什么要从 Linux 迁移到 BSD 5
  10. 在linux下如何搭建jmeter的环境