
Word 查找和替换字符串方法
发布日期:2021-05-09 04:15:01
浏览次数:21
分类:博客文章
本文共 3318 字,大约阅读时间需要 11 分钟。
因为项目需要通过word模板替换字符串 ,来让用户下载word, 就在网上找了找word查找替换字符串的库或方法,基本上不是收费,就是无实现,或者方法局限性太大
.docx 是通过xml来存储文字和其他信息的, 有时候一个单词表面上看到的是一个元素 ,其实内部分裂成了好多元素, 就像下面代码 ,在word文档中我们看到的是 abcdefgh,其实是这样存储的
ab c d e fgh
我们要查找替换上面代码中的 bcdef 就不是简单的string.replace 了,网上找到了几个方法都要求 bcdef在一个<text>里面或者一个<run>里面才可以,局限性比较大。索性就自己写了一个方法
//用于存放多个Text相加之后的尾部 和 替换字符串头部重叠的Text集合 static Listlist = new List (); 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 (); //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");
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月15日 02时11分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【集合框架】JDK1.8源码分析之LinkedList(七)
2021-05-09
【设计模式】策略模式
2021-05-09
【设计模式】命令模式
2021-05-09
Jenkins 集成postman 自动化运行接口测试用例
2021-05-09
hashlib 简单加密
2021-05-09
python装饰器实现对异常代码出现进行监控
2021-05-09
轮评审用例,写用例的重要性-----(python单元测试反思)
2021-05-09
django+appium实现UI自动化测试平台(开源部分,可定制开发)
2021-05-09
PAT 1008. Elevator (20)
2021-05-09
蓝桥杯 密码脱落 LCS
2021-05-09
第七届C/C++B-方格填数 DFS
2021-05-09
数据结构课设--3哈夫曼编码译码系统(树应用)
2021-05-09
pku 1061 青蛙的约会 扩展欧几里得
2021-05-09
Spring Boot 2.4 配置文件将加载机制大变化
2021-05-09
WPF之全局快捷键
2021-05-09
javascript 用函数语句和表达式定义函数的区别
2021-05-09
基于react hooks,antd4 配置生成表单并自动排列
2021-05-09
也来玩玩 javascript对象深拷贝,浅拷贝
2021-05-09
Kubernetes实战总结 - 动态存储管理StorageClass
2021-05-09