方案一、采用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. 可枚举接口的知识点(IEnumerable 接口)要使用foreach,就必须实现可枚举接口

  2. mongo删除、添加分片

    MongoDB 分片的原理.搭建.应用   一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处 ...

  3. [LuoguP3195] [HNOI2008]玩具装箱TOY

    [HNOI2008]玩具装箱(Link) 题目描述 \(P\)教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...

  4. 如何清理Macbook垃圾文件

    如何清理Macbook垃圾文件,腾出更多硬盘空间 在Macbook使用久之后,会发现本来还富裕的硬盘,变得越来越少,尤其现在Macbook使用容量很小的固态硬盘.在此种情况下,该如何清理Macbook ...

  5. java 编写小工具 尝试 学习(六)

    1.java 布局管理器-布局管理器之null布局(空布局) 的 学习,参考大神教程:http://www.cnblogs.com/liaoliao/p/5009445.html import jav ...

  6. PHP实现数组递归转义的方法

    本文以实例形式讲述了PHP实现数组递归转义的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: $arr = array('a"aa',array("c'd&quo ...

  7. Dynamic Ambient Occlusion and Indirect Lighting

    This sample was presented on the Nvida witesite, which detail a new idea to calculate the ambient oc ...

  8. linux 安装 node 环境

    本篇学习的分享主要说在linux 安装 node 环境,个人也是在腾讯云的实验室课程学习的,这里只是个人的一个学习记录, 大家也可以去腾讯的实验室来体验一下,教程十分详细易学. 1 .安装 Node. ...

  9. 个人对js面向对象和封装插件的用法

    做了一段时间的前端了,给自己写代码也总结出来了一点小小的思路,就来分享一下自己的意见和建议了. 面向对象和插件封装其实说到底都是面向对象的思想,但是插件一般是你要用的时候就new 调用出来的.就说一下 ...

  10. margin中的bug解决方法

    margin bug问题 : 当做子元素中使用margin-top: 50px;父子元素都会跑出50px, 解决方法: 在父元素中使用下面三种任意一种都可以. 方法一:给父元素加边框 border: ...