zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    智能电视可以安装软件就可以摆脱很多限制,而且可以和PC共享影音资源这个很靠谱。
    【转载】福昕PDF电子文档处理套件 企业版 注册码 注册方法
    OS X系列文章 AirPlay+Apple TV影音方案研究[转]
    SHARP 316L打印机64位驱动问题
    我和电脑的二三事
    北信源DeviceRegister.exe的卸载方法 【转】
    上篇随笔的补充。
    ApplicationCommands用于表示应用程序程序员经常遇到的常见命令,类似于ctrl+c
    WPF中类似使用tab键功能,可以向上向下定位
    c#通过datatable导出excel和word
  • 原文地址:https://www.cnblogs.com/riddly/p/9231719.html
Copyright © 2011-2022 走看看