zoukankan      html  css  js  c++  java
  • asp.net 将word文档进行编辑并导出一个新的word

    最近做项目,需要多word文档进行编辑并导出一个新的word,在最初的word编辑中留下特定的字符串用来替换,然后在本地生成一个新的word文档,并且不修改服务器中的word文档,这样才能保证服务器中的文件在下次使用的时候能正常使用。

    代码:

         /// <summary>
            /// 读取出word文档中的内容后对word文档进行修改并保存在本地
            /// </summary>
        /// <param name="jtmodel">实体类(在数据库中读取出来的数据)</param> /// <param name="pathfile">替换后的字符</param>
    private void ReadWord(Jtmodle jtmodel, String pathfile) { Microsoft.Office.Interop.Word.Document oWordDoc = null; Microsoft.Office.Interop.Word.ApplicationClass oWordApp = null; object missing = System.Reflection.Missing.Value; try { object fileName = System.Web.HttpContext.Current.Server.MapPath(pathfile).ToString(); object readOnly = false; object isVisible = true; oWordApp = new Microsoft.Office.Interop.Word.ApplicationClass(); oWordDoc = oWordApp.Documents.Open(ref fileName, ref missing, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible, ref missing, ref missing, ref missing); #region 字符替换 oWordApp = Replce("{htmc}", jtmodel.htmc.ToString(), oWordApp); oWordApp = Replce("{htbh}", jtmodel.htbh.ToString(), oWordApp); oWordApp = Replce("{qydd}", jtmodel.qydd.ToString(), oWordApp); oWordApp = Replce("{qyrq}", jtmodel.qyrq.ToString(), oWordApp); oWordApp = Replce("{sxrq}", jtmodel.sxrq.ToString(), oWordApp); oWordApp = Replce("{fkqx}", jtmodel.fkqx.ToString(), oWordApp); oWordApp = Replce("{jfqx}", jtmodel.jfqx.ToString(), oWordApp);#endregion #region 保存文件到客户端 string filePath = @"d:\WordDown\"; if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } if (!System.IO.File.Exists(@"d:\WordDown\" + jtmodel.name.Trim() + ".doc")) { oWordDoc.SaveAs(@"d:\WordDown\" + jtmodel.name.Trim() + ".doc"); ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", @"<script>alert('合同文档生成成功,已保存在本地磁盘D:\WordDown\" + jtmodel.name.Trim() + ".doc!');</script>"); } else { ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", @"<script>alert('该合同文档已经存在本地磁盘D:\WordDown\" + jtmodel.name.Trim() + ".doc,生成失败!');</script>"); } oWordApp.NormalTemplate.Saved = true; oWordDoc.Close(ref missing, ref missing, ref missing); oWordApp.Application.Quit(ref missing, ref missing, ref missing); #endregion } catch { oWordDoc.Close(ref missing, ref missing, ref missing); oWordApp.Application.Quit(ref missing, ref missing, ref missing); } } /// <summary> /// 替换word中的字符串 /// </summary> /// <param name="oldstr">被替换的符</param> /// <param name="newstr">替换后的字符</param> /// <param name="oWordApp"></param> private Microsoft.Office.Interop.Word.ApplicationClass Replce(string oldstr, string newstr, Microsoft.Office.Interop.Word.ApplicationClass oWordApp) { object missing = System.Reflection.Missing.Value; oWordApp.Selection.Find.ClearFormatting(); oWordApp.Selection.Find.Replacement.ClearFormatting(); oWordApp.Selection.Find.Text = oldstr; oWordApp.Selection.Find.Replacement.Text = newstr; object objReplace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; oWordApp.Selection.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref objReplace, ref missing, ref missing, ref missing, ref missing); return oWordApp; }

    原本不打算用替换字符串的方式编辑word,在网上看到还有可以在word中添加标签的然后对word文档进行编辑,但是苦于不知道怎么给word文档插入标签,只好适用替换字符串的方法来实现功能了

    异常:

    检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
    解决方法:
    <system.web>
      <identity impersonate="true" userName="Administrator" password="abc123"/>
      </system.web>


    IIS中 oWordApp.Documents.Open 为空的解决办法:


    1.(适用于.NET)
     1).通过webconfig中增加模拟,加入管理员权限,
     <identity impersonate="true" userName="系统管理员" password="系统管理员密码"/>
     2).这样就能够启动Application进程,操作EXCEL了,能够新建EXCEL,导出EXCEL,但是还是不能打开服务器端的EXCEL文件

    2.(以下适用于所有语言)
      在组件服务,DOCM设置 Microsoft Excel Application的属性,
      因为是在64位系统上面操作,组件服务中DOCOM中默认是没有的,因为Microsoft Excel Application是32的DCOM配置,所以通过如下方式解决(参考第三步)

    3.(在64bit系统中的DCOM管理中添加32Bit的Excel、Word等的管理)
       1).开始--〉运行--〉cmd
       2)命令提示符下面,输入“mmc -32”回车,打开32的控制台
       3).文件菜单中,添加删除管理单元--〉“组件服务”(在最下面),确认后,关闭即可。
       4).开始-管理工具-组件服务,在"DCOM配置"中,可以找到“"Microsoft Excel 应用程序”了。找到“Microsoft Excel 应用程序”,在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框
     5).点击“标识”标签,选择“交互式用户” **:这个在32Bit的2003上或XP上不需要,但这里需要。
     6).点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限
       7).依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限.

    4.重新启动IIS,测试通过

  • 相关阅读:
    泛微云桥e-Bridge 目录遍历,任意文件读取
    (CVE-2020-8209)XenMobile-控制台存在任意文件读取漏洞
    selenium 使用初
    将HTML文件转换为MD文件
    Python对word文档进行操作
    使用java安装jar包出错,提示不是有效的JDK java主目录
    Windows server 2012安装VM tools异常解决办法
    ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则
    iostat iotop 查看硬盘的读写、 free 查看内存的命令 、netstat 命令查看网络、tcpdump 命令
    使用w uptime vmstat top sar nload 等命令查看系统负载
  • 原文地址:https://www.cnblogs.com/mrma/p/4349699.html
Copyright © 2011-2022 走看看