因为项目需要通过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 "";
}

Word 查找和替换字符串方法的更多相关文章

  1. Linux使用vim进行多文件查找和替换的方法

    vim是Linux系统下常用的文本编辑,通过使用多种shell命令能够实现多文件的查找和替换,那么具体会使用到那些命令呢?下面小编就给大家介绍下Linux系统vim多文件查找和替换的方法. 在linu ...

  2. 在LoadRunner中查找和替换字符串

    参考<Search & Replace function for LoadRunner>: http://ptfrontline.wordpress.com/2009/03/13/ ...

  3. Python之word文档替换字符串(也可以用于短模板套用)

    Python之word文档替换字符串(也可以用于短模板套用),代码如下: 1 ''' 2 #word模板套用1:创建模板,适合比较短的文档 3 ''' 4 5 #导入所需库 6 from docx i ...

  4. Word查找和替换通配符(完全版)

    Word查找栏代码·通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^# 任意数字(单 ...

  5. Word 查找和替换的通配符

    查找和替换的通配符 若要查找 类型 示例 任意单个字符 ? s?t 可查找“sat”和“set”. 任意字符串 * s*d 可查找“sad”和“started”. 单词的开头 < <(in ...

  6. word查找与替换

    ------------恢复内容开始------------ 如何快速删除大量空格键:查找和替换-更多-特殊格式-查找内容[特殊格式(段落标记)]设置为(^p^p,即点击两次段落标记),替换设置为(^ ...

  7. Shell:sed用法 - 查找并替换字符串

    原文链接 语法 sed 's/serach_str/replace_str/g' file_path 在某个文件中查找所有的serach_str并替换为replace_str 参数 描述 serach ...

  8. JS查找和替换字符串列子

    依赖 工具函数库 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  9. 查找并替换字符串 Find And Replace in String

    2018-07-29 17:08:15 问题描述: 问题求解: 字符串替换的问题有个技巧就是从右向左进行替换,这样的话,左边的index就不需要考虑变动了. public String findRep ...

随机推荐

  1. 【Notes】现代图形学入门_02

    跟着闫令琪老师的课程学习,总结自己学习到的知识点 课程网址GAMES101 B站课程地址GAMES101 课程资料百度网盘[提取码:0000] 光栅化 着色(Shading) 在图形学中,着色的定义可 ...

  2. Python函数注解

    目录 函数注解概述 实际应用 inspect模块 业务代码 总结 以下内容基于Python 3x 涉及的知识前提: 建议理解Python装饰器后学习此内容 函数注解概述 函数注解可以针对函数的参数.返 ...

  3. 身份认证:JSON Web Token

    JSON Web Token(JWT)是一种基于JSON的开放标准((RFC 7519),也是目前最流行的跨域认证解决方案. 传统的 cookie 认证方式看起来遵守了 REST 架构的无状态要求,但 ...

  4. gRPC-go源码(2):ClientConn

    摘要 在上一篇文章中,我们聊了聊gRPC是怎么管理一条从Client到Server的连接的. 我们聊到了gRPC拥有Resolver,用来解析地址:拥有Balancer,用来做负载均衡. 在这一篇文章 ...

  5. Visual Studio Code运行Python代码

    目录 步骤 参考 用Pycharm开发Python程序是最好的选择,就是有点贵.基于这个背景,我就尝试一下别的IDE,看到很多人在用免费.开源的Visual Studio Code,下面是配置并运行P ...

  6. 440. 字典序的第K小数字 + 字典树 + 前缀 + 字典序

    440. 字典序的第K小数字 LeetCode_440 题目描述 方法一:暴力法(必超时) package com.walegarrett.interview; /** * @Author WaleG ...

  7. 剑指 Offer 24. 反转链表

    剑指 Offer 24. 反转链表 Offer 24 题目描述: 常规解法 本题的解法很常规,没有其他特别的坑,只需要将链表反转即可. package com.walegarrett.offer; / ...

  8. C语言经典88案例,我文科妹妹说她都学会了!

    案例ex01: 将字符串转换为一个整数 1 题目 函数:fun() 功能:将字符串转换为一个整数 描述: [不能使用C语言提供的字符串函数] 输入:字符串"-1234" 输出:整型 ...

  9. Python3读取网页HTML代码,并保存在本地文件中

    旧版Python中urllib模块内有一个urlopen方法可打开网页,但新版python中没有了,新版的urllib模块里面只有4个子模块(error,request,response,parse) ...

  10. linux云服务搭建Minecraft服务器

    1 准备工作 以下内容全部要在root用户内完成 1.1 安装文件传输工具 为了方便传文件到服务器上,这里先装一个远程传输工具. yum -y install lrzsz 1.2 安装java Min ...