因为项目需要通过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_9】现代图形学入门——光线追踪(基本原理)

    跟着闫令琪老师的课程学习,总结自己学习到的知识点 课程网址GAMES101 B站课程地址GAMES101 课程资料百度网盘[提取码:0000] 目录 光线追踪 为什么要光线追踪 soft shadow ...

  2. 微信小程序:报错fail webview count limit exceed

    报错: 分析原因: 先从列表页面跳转到详细页面时,使用了Navigator标签,open-type默认使用的navigate,跳转时会保留当前页, <navigator class=" ...

  3. Vue脚手架中默认的margin怎么清除

    问题情景:开发中发现我的项目四周有白边,但是并没有设置样式 问题原因:vue脚手架中静态文件夹public中的index.html造成的 解决方案:找到vue脚手架中index.html页面,设置ma ...

  4. 使用 Java 开发 Gradle 插件

    Gradle 插件代码可以在 build.gradle 中,buildSrc 项目中,以及独立的插件项目中编写.本文将介绍如何在一个独立的项目中使用 Java 语言编写 Gradle 插件,并发布到仓 ...

  5. React开发入门:以开发Todo List为例

    目录 概述 React基本概念 JSX是什么? 设置React APP 初始化APP 应用结构 探索第一个React组件 index.js 变量和props JSX中的变量 组件props props ...

  6. C++图论算法——图的储存方式

    使用二维数组邻接矩阵储存图 无向图: 图G 定义图G[101][101],G[i][j]的值表示从结点vi到vj是否有边或弧,若有,取值为1或权值,若无,则取值为0或∞.以下是图G用邻接矩阵表示的列表 ...

  7. gRPC在 ASP.NET Core 中应用学习

    一.gRPC简介: gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2 ...

  8. Thinkphp3分析与审计

    0x00 前言: 这篇是去年组内分享的时候给小伙伴写的0基础快速审计tp3系列的文章,主要是对架构做个分析以及审计一些sql注入漏洞~ 现在想想打算放出来,过了一年了,可能里面有一些问题,望看到的大佬 ...

  9. uni-app(二)接口请求封装,全局输出api

    在项目 main.js 同级创建 utils 文件夹, utils里创建 config.js文件,存储重要参数 // 获取平台信息 const { system, } = uni.getSystemI ...

  10. for-in 语句

    for-in 语句循环专门用于遍历范围,列表,元素和字典等可迭代对象. 循环中的变量的值受for-in循环控制,该变量将会在每次循环开始时自动被赋值,因此程序不应该在循环中对该变量进行赋值 for-i ...