首页 > 编程语言 >C#替换Word中的文本内容(亲测)

C#替换Word中的文本内容(亲测)

时间:2023-12-22 11:00:14浏览次数:45  
标签:Word C# app Microsoft nullobj ref 替换 亲测

1

   Word文档文本替换时长度不能超过255个字符,不能一次性替换,本方法通过循环替换,达到替换超过255字符的目的。

/// <summary>
/// 替换word中的文字
/// </summary>
/// <param name="filePath">文件的路径</param>
/// <param name="datas">包含待替换字符串和替换字符串的集合</param>
/// <returns>true 替换成功;false 替换失败</returns>
public static bool WordReplace(string filePath, Dictionary<string, string> datas)
{
    bool result = false;
    Microsoft.Office.Interop.Word._Application app = null;
    Microsoft.Office.Interop.Word._Document doc = null;
 
    object nullobj = Type.Missing;
    object file = filePath;
 
    try
    {
        app = new Microsoft.Office.Interop.Word.Application();//new Microsoft.Office.Interop.Word.ApplicationClass();
 
        doc = app.Documents.Open(
        ref file, ref nullobj, ref nullobj,
        ref nullobj, ref nullobj, ref nullobj,
        ref nullobj, ref nullobj, ref nullobj,
        ref nullobj, ref nullobj, ref nullobj,
        ref nullobj, ref nullobj, ref nullobj, ref nullobj) as Microsoft.Office.Interop.Word._Document;
 
        //app.Selection.ParagraphFormat.CharacterUnitFirstLineIndent = 2;//首行缩进的长度
 
        object objReplace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
 
        foreach (var item in datas)
        {
            app.Selection.Find.ClearFormatting();
            app.Selection.Find.Replacement.ClearFormatting();
            string oldStr = item.Key;//需要被替换的文本
            string newStr = item.Value; //替换文本 
 
            if (newStr == null)
            {
                newStr = "";
            }
            int newStrLength = newStr.Length;
            if (newStrLength <= 255) // 长度未超过255时,直接替换
            {
                app.Selection.Find.Text = oldStr;
                app.Selection.Find.Replacement.Text = newStr;
 
                app.Selection.Find.Execute(ref nullobj, ref nullobj, ref nullobj,
                                           ref nullobj, ref nullobj, ref nullobj,
                                           ref nullobj, ref nullobj, ref nullobj,
                                           ref nullobj, ref objReplace, ref nullobj,
                                           ref nullobj, ref nullobj, ref nullobj);
                continue;
            }
            //word文本替换长度不能超过255
            int hasSubLength = 0;
            int itemLength = 255 - oldStr.Length;
            while (true)
            {
                string itemStr = "";
                int subLength = 0;
                if (newStrLength - hasSubLength <=255)  // 剩余的内容不超过255,直接替换
                {
                    app.Selection.Find.ClearFormatting();
                    app.Selection.Find.Replacement.ClearFormatting();
 
                    app.Selection.Find.Text = oldStr;
                    app.Selection.Find.Replacement.Text = newStr.Substring(hasSubLength, newStrLength - hasSubLength);
 
                    app.Selection.Find.Execute(ref nullobj, ref nullobj, ref nullobj,
                                                ref nullobj, ref nullobj, ref nullobj,
                                                ref nullobj, ref nullobj, ref nullobj,
                                                ref nullobj, ref objReplace, ref nullobj,
                                                ref nullobj, ref nullobj, ref nullobj);
                    break; // 结束循环
                }
 
                // 由于Word中换行为“^p”两个字符不能分割
                // 如果分割位置将换行符分开了,则本次少替换一个字符
                if (newStr.Substring(hasSubLength, itemLength).EndsWith("^") &&
                    newStr.Substring(hasSubLength, itemLength + 1).EndsWith("p"))
                {
                    subLength = itemLength - 1;
                }
                else
                {
                    subLength = itemLength;
                }
 
                itemStr = newStr.Substring(hasSubLength, subLength) + oldStr;
 
                app.Selection.Find.ClearFormatting();
                app.Selection.Find.Replacement.ClearFormatting();
 
                app.Selection.Find.Text = oldStr;
                app.Selection.Find.Replacement.Text = itemStr;
 
                app.Selection.Find.Execute(ref nullobj, ref nullobj, ref nullobj,
                                            ref nullobj, ref nullobj, ref nullobj,
                                            ref nullobj, ref nullobj, ref nullobj,
                                            ref nullobj, ref objReplace, ref nullobj,
                                            ref nullobj, ref nullobj, ref nullobj);
                hasSubLength += subLength;
            }
        }
        //保存
        doc.Save();
        result = true;
    }
    catch
    {
        result = false;
    }
    finally
    {
        if (doc != null)
        {
            doc.Close(ref nullobj, ref nullobj, ref nullobj);
            doc = null;
        }
        if (app != null)
        {
            app.Quit(ref nullobj, ref nullobj, ref nullobj);
            app = null;
        }
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
    return result;
}

每次替换的长度为255减去待替换文本长度;

另外,Word中的换行符是“^p”,如果替换文本中有换行符,需要在循环替换时检查是否将该字符切割了,如果切割了,则少截取一个字符;

---转自fengxingke

2

3

标签:Word,C#,app,Microsoft,nullobj,ref,替换,亲测
From: https://www.cnblogs.com/CS-ComputerScience/p/17920823.html

相关文章

  • 十八、组件-容器组件-column、row、flex
    @Entry@ComponentstructColumExample{build(){Column({space:10}){Column(){Column().width('50%').height(30).backgroundColor(Color.Blue)Column().width('60%').height(40).backgroundColor(Color.Brown)......
  • CRM系统线索分配的优势,让你的销售竞争力更强
    CRM系统是企业积累客户数据的重要工具,CRM中储存的客户信息和销售数据为销售团队提供了宝贵的线索管理。那么,CRM系统线索分配能帮助企业增长吗?一、线索池线索储存方式:CRM的线索池是一个集中的储备库,用于存储来自不同渠道的线索,如市场活动、网页表单、广告推广和在线注册等。这些......
  • CRM系统的必要性:如何解决客户跟进的常见问题和挑战?
     众所周知,在销售开始跟进客户时,制定一个详细的跟进计划是至关重要的,尤其当客户方涉及多个联系人时,合理的管理方法能有效提升销售业绩。现在跟着小编一起了解下,CRM系统如何帮助企业精准跟进客户吧? 一、客户信息查阅客户信息调取:确保在跟进过程中能充分了解客户的背景和需求......
  • CRM在线演示的作用,为什么对选型很重要
    在CRM挑选环节中,假如企业需要深入了解CRM管理系统的功能和功能,就需要CRM厂商提供在线演示。简单的说,就是按照企业的需要,检测怎样通过CRM进行。如今我们来谈谈CRM在线演示的作用。1、了解CRM情况熟悉系统功能:依据CRM线上演示,企业能够直观地看到CRM系统页面风格、模块、资料显示方......
  • SpringMVC处理Java8新日期类参数
    SpringMVC如何将request参数自动封装为LocalDate和LocalDateTime在使用SpringMVC时,java.util.Date类型字段可以使用@DateTimeFormat注解将application/x-www-from-urlencoded类型的请求中的字符串进行自动转换。而Java8中新的时间类型该如何支持呢?在application/x-www-from-u......
  • mac下Tmux的简单使用
    我使用tmux目前主要用来把一个窗口切分成几个,所以只是一些简单的使用。搜索网上的教程太过复杂,甚至一些概念没搞清楚,前缀键、快捷键的使用也不太清楚。所以,还是费了一些工夫。所以,简单记录一下。避免时间长了忘记。一、前缀键:默认是Ctl+b。就是使用快捷键前,你得先按下ctl+b。......
  • 性价比高的CRM系统推荐,选型前必看
     对于中小企业来说,选型CRM系统的重点便是性价比。中小企业预算有限,要在满足需求的前提下选择符合预算的CRM系统。那么,有没有性价比高的CRM系统?ZohoCRM就很不错哦。 ZohoCRM是一款SaaS云端CRM客户管理系统,多次荣获CRM系统国际大奖。不仅如此,ZohoCRM更是连续12年入选Gartne......
  • canvas操作图片像素点保证你看的明明白白
    开场白今天遇到一个场景;就是更改一个图片的颜色;当听到这个。我直呼好家伙;这个是要上天了呀。但是仔细一思考;借助canvas好像也能实现;于是下来研究了一下,并不难;我们下面来看看怎么实现的基本思路主要是获取图片的像素点;ctx.getImageData()然后去更改图片的像素点;最后绘制......
  • Nacos漏洞复现总结
    目录未授权访问(CVE-2021-29441)漏洞简介影响版本环境搭建漏洞复现权限绕过登陆(QVD-2023-6271)漏洞简介影响版本环境搭建漏洞复现未授权访问(CVE-2021-29441)漏洞简介该漏洞发生在nacos在进行认证授权操作时,会判断请求的user-agent是否为"Nacos-Server",如果是的话则不进行任何......
  • CPU测试解决方案浅析
    一、CPU概述中央处理器(CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。应用处理器SoC是在中央处理器的基础上扩展音视频功能和专用接口的超大规模集成电路,是智能设备的“大脑”,在智能设备中起着运算及调用其他各功能构件的作用。CPU内部主要由运算器、......