方案一、采用OpenXml(服务器不依赖Office组件)

在word生成的最后加上代码:

using (WordprocessingDocument docx = WordprocessingDocument.Open(sourceRealReportPath, true))

{

//操作word代码

//更新域

docx.MainDocumentPart.DocumentSettingsPart.Settings.Append(new DocumentFormat.OpenXml.Wordprocessing.UpdateFieldsOnOpen() { Val = true });

docx.Close();

}

采用这种方式生成word之后,需要打开word时才触发更新更新域操作,且打开word时会有提示框,若要去除提示框,需在客户机上进行以下两步操作:

1、修改注册表:(找到对应office版本)

HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Word\Options

新增或修改DWORD Value:FieldCalcSecurityLevel;值设置为0

FieldCalcSecurityLevel

DisplayAlerts=wdAlertsNone

0

Message does not appear and Link Group fields update automatically.

1

Message is suppressed and Link Group Fields update.

2

Message is suppressed and Link Group Fields do not update.

注意:

1、这里存在问题,如果不打开word的话,目录无法更新,必须有使用office打开word的操作

2、不打开word,直接通过office web 365转Pdf或者在线阅读word,目录也不会更新

2、修改office->选项->信任中心->信任中心设置->受保护视图:

移除掉:”为来自Internet的文件启用受保护视图”前面的勾选

方案二、采用Office组件(服务器必须安装Office)

采用Office组件调用实现更新目录的话,有一些弊端:

①服务器必须安装office

②调用com组件实际上相当于在服务器上打开word进行操作,当并发量比较大时,word的处理速度会比较慢,并发量越大处理越慢,可以想象,当电脑打开50个word时,操作肯定会卡,这是一个道理;暂时还未发现有效的解决方法。

(实例化一个com实例,处理多个文件倒是可以加快速度,但是要看实际的应用场景是否可以多个文件一起处理;我现在遇到的场景是必须同步一个个文件进行处理,纠结中,,,,)

服务器安装office并需要配置环境:

(参考:https://www.cnblogs.com/5426z/articles/4865312.html)

①首先服务器需要安装:office软件,我安装的是office2010版本,安装后在服务器端不用激活也可以使用。

②组件权限设置:

在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Microsoft Word程序,这主要是64位系统的问题,word是32位的组件,所以在正常的系统组件服务里是看不到的,可以通过在运行里面输入comexp.msc -32 来打开32位的组件服务,在里就能看到Microsoft Word组件了。

③IIS权限设置:将IIS中应用程序池运行用户改为LocalSystem

必须要先配置组件权限,仅仅将IIS中应用程序池运行用户改为LocalSystem是不行的:不会报80070005组件错误,但是读取的word对象会为null

 DCOM 的配置过程。

1、运行“dcomcnfg”,打开 DCOM 配置程序。(或者 开始→设置→控制面版→管理工具→组件服务→计算机→我的电脑→DCOM配置)

对 Word进行编程,实际上就是通过 .Net
Framework 去调用 Excel 的 COM 组件,所有要在 Web 环境下调用 COM 组件的时候,都需要对其进行相应的配置。
很多朋友都反映在 Windows 环境下调试正常的程序,一拿到 Web 环境中就出错,实际上就是因为缺少了这一步。

①将 “身份标识” 选项卡中的用户设为 “交互式用户” 。

②设置选中 “安全性” 选项卡中的 “使用自定义配置权限”,点击 “编辑”。

③用户添加 EveryOne、 IIS User、NetWork Service,并将所有操作权限都勾选(建议)

.net开发环境搭建:

Vs开发com组件引用

(我这里本机安装的是office2010,根据各自电脑安装的情况选择即可)

这样就可以使用了:(参考代码)

 //实例化COM
Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
object fileobj = filePath;
object nullobj = System.Reflection.Missing.Value;
//打开指定文件(不同版本的COM参数个数有差异,一般而言除第一个外都用nullobj就行了)
Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(ref fileobj, 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
);
//更新目录
doc.TablesOfContents[1].Update();
//LogHelper.Info(string.Format("操作3.1"));
doc.Save();//保存 //获取Word页码
Microsoft.Office.Interop.Word.WdStatistic PagesCountStat = Microsoft.Office.Interop.Word.WdStatistic.wdStatisticPages;
pageCount = doc.ComputeStatistics(PagesCountStat, ref nullobj);
//关闭文件
doc.Close(ref nullobj, ref nullobj, ref nullobj);
//关闭COM
wordApp.Quit(ref nullobj, ref nullobj, ref nullobj);

引用完成之后,如果直接用vs进行跑是没有问题的,但是放在iis上面会提示:

检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
再回到上面检查权限配置是否正确。(一开始我也是报这种错误)

方案三、收费方案(SautinSoft等)

暂时未考虑,收费方案基本都是按开发人员,按部署的项目数来进行收费,代价会比较大。

使用.net 更新word目录的更多相关文章

  1. C# 操作Word目录——生成、删除目录

    目录,是指书籍.文档正文前所载的目次,将主要内容以一定次第顺序编排,起指导阅读.检索内容的作用.在Word中生成目录前,需要设置文档相应文字或者段落的大纲级别,根据设定的大纲级别可创建文档的交互式大纲 ...

  2. 第六周 Word目录和索引

    第六周 Word目录和索引 教学时间 2013-4-2 教学课时 2 教案序号 5 教学目标 能正确使用索引.目录等 教学过程: 复习提问 1.脚注和尾注的区别是什么?2.如何插入脚注和尾注?3.如何 ...

  3. 解决svn更新项目目录时“Error:svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted”的报错问题

    今天在IDEA更新项目目录时,发现报错“Error:svn: E155037: Previous operation has not finished; run 'cleanup' if it was ...

  4. SVN 如何更新整个目录

    SVN 有时会遇到更新整个目录的情况, 比如依赖的某个库有了新版本, 需要更新. 这个时候的处理可能需要注意一些问题.(直接跳到最后看结论) 举个例子: 根文件是 test, 里面用 external ...

  5. html+css写出类似word目录样式的内容

    word目录的格式里这种很常见,要用html+css写出来刚开始还有点懵. 左右两边都是内容撑开宽度,中间内容的宽度也不是确定的,也是随着左右两边的内容动态变化的. 最终解决思路是,给右边内容加上白色 ...

  6. Java 添加Word目录的2种方法

    目录是一种能够快速.有效地帮助读者了解文档或书籍主要内容的方式.在Word中,插入目录首先需要设置相应段落的大纲级别,根据大纲级别来生成目录表.本文中生成目录分2种情况来进行: 1.文档没有设置大纲级 ...

  7. MS Word 目录排版

    昨天整理一份把网页的内容复制粘贴到Word里的文件,碰到了这样一个问题: 网页上面也会有一级标题,二级标题,三级标题等.当我们在写博客的时候,也会去使用这些.这也就导致复制过来之后,直接生成的目录很乱 ...

  8. 解决idea spring boot项目中target中没有同步更新最新目录文件及资源

    idea不像eclipse那样自动将新保存的文件或目录及其他资源更新到target目录中,必须在pom.xml中设置 <build> <resources> <resou ...

  9. windows,linux下SVN实现自动更新WEB目录

    通过SVN进行版本库管理,每次提交后,都要在SVN服务器更新最新上传的版本到WEB目录进行同步.操作比较烦琐,而且效率也低.使用SVN钩子脚本进行WEB目录同步,可很好的解决这方面的问题.由于测试机器 ...

随机推荐

  1. angular.js和ionic框架搭建一个webApp

    原文地址:http://www.jianshu.com/p/ea0dcf1d31c9

  2. MVC学习十三:RouteDebugger插件应用

    1.下载第三方程序集RouteDebugger https://files.cnblogs.com/files/WarBlog/RouteDebugger.rar 2.把RouteDebugger程序 ...

  3. 如何解决使用JMeter时遇到的问题

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件. ...

  4. 阿贾克斯(AJAX)

    AJAX   :Asynchronous JavaScript and XML 异步的javascript 和xml 优点 : 在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分数据 不需要 ...

  5. react系列(六)Redux Saga

    在Redux中常要管理异步操作,目前社区流行的有Redux-Saga.Redux-thunk等.在管理复杂应用时,推荐使用Redux-Saga,它提供了用 generator 书写类同步代码的能力. ...

  6. ARM对异常的处理

    所谓中断就是中断SoC的CPU核(异常可以引起CPU的中断) ARM对异常的处理 1.初始化: 1)设置中断源让它可以产生中断.如某个按键可以产生中断,那么可以设置它的GPIO引脚为中断引脚: 2)设 ...

  7. LeetCode 中级 - 重新排序得到的幂(105)

    从正整数 N 开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零. 如果我们可以通过上述方式得到 2 的幂,返回 true:否则,返回 false. 示例 1: 输入:1 输出 ...

  8. 阿里云Docker镜像仓库(Docker Registry)

    镜像仓库申请地址: https://cr.console.aliyun.com/cn-shanghai/instances/repositories   一.创建命名空间 例如daniel-hub   ...

  9. Dubbo 安装监控中心

    一.Dubbo 安装服务管理控制台 1.在官方Github下载Dubbo OPS 2.下载incubator-dubbo-ops源码后,解压修改配置文件Zookeeper注册中心地址 3.maven打 ...

  10. 用jQuery实现(全选、反选、全不选功能)

    在jQuery选择器的基础下我们实现一个全选,反选,全不选功能! <script type="text/javascript">        $(function ( ...