c# word操作篇,解决字符串长度超过255就不能替换的问题

本文使用的是Microsoft.Office.Interop.Word组件,必须在系统安装了office相关组件的条件下进行,在com里面找到Microsoft  Word 16.0 Object Library并引用。

问题:使用c#操作word替换占位符的时候,当要替换的字符串超过一定的长度,就会提示“字符串参量过长”,搜索发现,替换的最大长度为255字符。

以220个字符串为例,执行替换工作。

         //构造数据
        Dictionary<string, string> datas = new Dictionary<string, string>() { { "{name}", "张三" }, { "{sex}", "男" }, { "{provinve}", "浙江" } };
        //模板文件
        object path = Server.MapPath("/Template/template.docx");
        //生成文件
        string physicNewFile = Server.MapPath("/createdfile/" + Guid.NewGuid().ToString() + ".docx");
        /// <summary>
        /// 根据模板生成替换文件并下载
        /// </summary>
        /// <param name="path">文件/模板地址</param>
        /// <param name="datas">需要替换的key:value集合</param>
        /// <param name="physicNewFile">生成文件地址</param>
        public void ReplaceToWord(object path, Dictionary<string, string> datas, string physicNewFile)
        {
            Microsoft.Office.Interop.Word.Application app = null;
            Microsoft.Office.Interop.Word._Document doc = null;
            object oMissing = System.Reflection.Missing.Value;
            try
            {
                app = new Microsoft.Office.Interop.Word.Application();
                object fileName = path;
                //打开模板文件
                doc = app.Documents.Open(ref fileName,
                ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

                object replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;

                foreach (var item in datas)
                {
                    app.Selection.Find.Replacement.ClearFormatting();
                    app.Selection.Find.ClearFormatting();
                    if (item.Value.Length > 220)
                        FindAndReplaceLong(app, item.Key, item.Value);
                    else
                        FindAndReplace(app, item.Key, item.Value);
                }

                //对替换好的word模板另存为一个新的word文档
                doc.SaveAs(physicNewFile,
                oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
                oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

                //准备导出word
                Response.Clear();
                Response.Buffer = true;
                Response.Charset = "utf-8";
                Response.AddHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMddHHmmssss") + ".doc");
                Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
                Response.ContentType = "application/ms-word";
                Response.End();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (doc != null)
                {
                    //关闭word文档
                    doc.Close(ref oMissing, ref oMissing, ref oMissing);
                    doc = null;
                }
                if (app != null)
                {
                    //退出word应用程序
                    app.Quit(ref oMissing, ref oMissing, ref oMissing);
                    app = null;
                }
                //GC.Collect();
                //GC.WaitForPendingFinalizers();
                //GC.Collect();
                //GC.WaitForPendingFinalizers();
                //如果文件存在则输出到客户端
                if (System.IO.File.Exists(physicNewFile))
                {
                    Response.WriteFile(physicNewFile);
                }
            }
        }
        /// <summary>
        /// 根据字符串长度执行替换操作
        /// </summary>
        /// <param name="wordApp">当前word程序</param>
        /// <param name="findText">占位符(key)</param>
        /// <param name="replaceText">替换字符串(值)</param>
        public  void FindAndReplaceLong(Microsoft.Office.Interop.Word.Application wordApp, object findText, object replaceText)
        {
            int len = replaceText.ToString().Length;   //要替换的文字长度
            int cnt = len / 220;                    //不超过220个字
            string newstr;
            object newStrs;
            if (len < 220)   //小于220字直接替换
            {
                FindAndReplace(wordApp, findText, replaceText);
            }
            else
            {
                for (int i = 0; i <= cnt; i++)
                {
                    if (i != cnt)
                        newstr = replaceText.ToString().Substring(i * 220, 220) + findText;  //新的替换字符串
                    else
                        newstr = replaceText.ToString().Substring(i * 220, len - i * 220);    //最后一段需要替换的文字
                    newStrs = newstr;
                    FindAndReplace(wordApp, findText, newStrs);                              //进行替换
                }
            }
        }
        /// <summary>
        /// 执行替换操作
        /// </summary>
        /// <param name="wordApp">当前word程序</param>
        /// <param name="findText">占位符(key)</param>
        /// <param name="replaceText">替换字符串(值)</param>
        public  void FindAndReplace(Microsoft.Office.Interop.Word.Application wordApp, object findText, object replaceText)
        {
            //object oMissing = System.Reflection.Missing.Value;
            object matchCase = true;
            object matchWholeWord = true;
            object matchWildCards = false;
            object matchSoundsLike = false;
            object matchAllWordForms = false;
            object forward = true;
            object format = false;
            object matchKashida = false;
            object matchDiacritics = false;
            object matchAlefHamza = false;
            object matchControl = false;
            object read_only = false;
            object visible = true;
            object replace = 2; //object replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
            object wrap = 1;
            wordApp.Selection.Find.Execute(ref findText, ref matchCase, ref matchWholeWord, ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap, ref format, ref replaceText,
                ref replace, ref matchKashida, ref matchDiacritics, ref matchAlefHamza, ref matchControl);
            // wordApp.Selection.Find.Execute( ref oMissing, ref oMissing,ref oMissing, ref oMissing,ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,ref oMissing, ref replace,
            //ref oMissing, ref oMissing,ref oMissing, ref oMissing);
        }

Asp.Net操作Word内容

如果要正常操作Word Com组件的话,必须要给用户赋上足够的权限的,

1、运行Dcomcnfg.exe

2、组件服务――计算机――我的电脑――DCOM配置――找到microsoft word 文档 
3、点击属性 
4、选择“安全性” 
5、选定“使用自定义访问权限”和“使用自定义启动权限” 
6、分别编辑权限,添加ASPNET,VS Developers,Debugger User //不一定
7、选择“身份标识”,在选定“交互式用户” 即可 (关键步骤)必须
8、在Web.config里加 <identity impersonate="true"/>

参考地址:https://blog.csdn.net/lutaotony/article/details/51789666

原文地址:https://www.cnblogs.com/riddly/p/9231719.html

时间: 2024-10-11 07:12:31

c# word操作篇,解决字符串长度超过255就不能替换的问题的相关文章

针对字符串长度超过8000的处理

if (exists (select * from sys.objects where name = 'up_test')) drop proc up_testgoCreate PROC [dbo].[up_test]asdeclare @SQL nvarchar(max), @SQL1 nvarchar(4000), @SQL2 nvarchar(4000), @SQL3 nvarchar(4000), @SQL4 nvarchar(4000);set @SQL1 = N'SQl语句1' ; 

angularjs如何在ng-repeat过程中控制字符串长度超过指定长度后面内容以省略号显示

1 angular.module('ng').filter('cut', function () { 2 return function (value, wordwise, max, tail) { 3 if (!value) return ''; 4 5 max = parseInt(max, 10); 6 if (!max) return value; 7 if (value.length <= max) return value; 8 9 value = value.substr(0, m

比strlen执行速度更快的处理字符串长度的函数

我们大多都用strlen来验证字符串的长度,但其实isset也可以验证字符串的长度. 假如,我想验证$var变量字符串长度超过5了么.如果是strlen 则会这样写strlen($var)>5. 而isset 则可以这样写 isset($var[5]).把var变量换成数组,在查看数组的第5个位置 为不为null.关键的是的isset比strlen快很多,因为isset不需要做任何计算,只返回在zval 结构中存储的已知字符串长度 刚刚和朋友讨论的时候,发现isset不能判断小于和等于,于是  

使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值

Type : System.InvalidOperationException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Message : 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串 的长度超过了为 maxJsonLength 属性设置的值. Source : System.Web.Extensions Help link : Dat

C语言 realloc为什么要有返回值,realloc返回值详解/(解决任意长度字符串输入问题)。

在C语言操作中会用到大量的内存操作,其中很常用的一个是realloc(). 由字面意思可以知道,该函数的作用是用于重新分配内存. 使用方式如下: NewPtr=(数据类型*)realloc(OldPtr,MemSize) 其中OldPtr指向 待重新分配内存的指针. NewPtr指向 新分配空间的指针. MemSize为 分配后的空间大小. 该函数的使用涉及以下几个问题: 1.不同情况下的返回值 2.OldPtr指向的内存会不会自动释放 3.OldPtr和NewPtr分别是什么内容,他们有什么关

.net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, string whereClause) { string str=""; return Json(str); } 此时如果str过长,就会报“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。

在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存. 使用方式例如以下: NewPtr=(数据类型*)realloc(OldPtr,MemSize) 当中OldPtr指向 待又一次分配内存的指针. NewPtr指向 新分配空间的指针. MemSize为 分配后的空间大小. 该函数的使用涉及下面几个问题: 1.不同情况下的返回值 2.OldPtr指向的内存会不会自己主动释放 3.OldPtr和NewPtr各自是什么

使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性

<system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="1024000" /> </webServices> </scripting> </system.web.extensions> 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$