最近的项目中有一个功能点为:根据分析数据库并生成报告。不过不是大数据、数据挖掘之类,报告的内容、组织方式都是事先固定下来的。实现的方式为,在普通word文档中插入书签制成模板,然后程序使用OpenXML解析文档,找到书签,并根据书签的意义进行相应的计算,最后用计算结果替换书签,替换的内容涉及到文本、图表、表格等。

  这一套已经可以稳定工作,但美中不足的是关于目录的问题,太长的文档开始有必要存在目录,但在模板中签入真实数据后,最后文档的篇幅每次都是不一样的,这就需要目录能都自动更新,但不知道OpenXML怎么实现(大侠遇到过的话恳请告知),最后找到了其它办法。

  第一种是使用宏。在模板中设置好标题并插入目录,然后在VBA编辑器中,双击This Document,添加如下代码:

Sub AutoOpen()
  Dim aStory As Range
  Dim aField As Field
     For Each aStory In ActiveDocument.StoryRanges
        For Each aField In aStory.Fields
           aField.Update
        Next aField
     Next aStory
End Sub

  目录属于域的一种,上面的代码大致意思是要求word在每次打开该文档时都遍历并更新每一个域,这样就把目录自动更新了。但这个方法在word禁用了宏时便会失效。

  第二种是手工修改word背后的XML文件,这个方法是看老外的一个视频学的,链接:http://ericwhite.com/blog/screen-cast-exploring-tables-of-contents-in-open-xml-wordprocessingml-documents/。不得不佩服,查找别的帖子的时候看到过视频作者的发言,这个Eric White之前也受困于这个问题,得到启示后把问题顺利解决,此外还做了这份非常细致的视频。

  要编辑所谓的“word背后的XML文件”,我的方法是把word后缀从"docx"改为“zip”,然后解压,记事本打开。Eric White的方法应该是用了OpenXML相关的插件,用vs可以直接打开word对应的xml文件并编辑,这个非常方便,可是我不会用唉。

  可以打开xml文件后,先修改settings.xml,在末尾加上一句  <w:updateFields w:val="true"/>,注意xml文件的层次。

  还要修改document.xml文件,找到目录所在的部分,不好找可以搜索w:fldChar,fldChar就是跟域相关的标签,模板中的每条目录都被包围在w:hyperlink标签之中,找到这些并删除,最终目录部分只留下这样的:

留意红框中的内容,最终相当于去掉了具体的目录信息,只保留了目录的框架。xml必须有闭标签,删除的时候留意别删错了,比如我当时的情况就是不小心把这个p标签删了。

  改好后,保存,重新压缩,将后缀改回“docx”便OK了。

  第一次打开会有询问是否更新域,选是。

以上便是这两种方法。各有优劣,对比一下

  方法一(宏) 方法二(修改XML)
失效 word禁用宏便会失效 不会失效
更新 每次打开自动更新 只在第一次更新
样式 可以设置目录的字体字号 不能修改目录样式

可以看到两种方法都不完美,应该还有更好的办法吧,请多指教。

转载于:https://www.cnblogs.com/zhixin9001/p/5587322.html

代码操作Word时,目录自动更新的两种方法相关推荐

  1. 【基础】代码操作Word时,自动更新目录(一)

    系列文 python-docx-template包之----为文字自定义格式(一) python-docx-template包之----设置表格(二) python-docx-template包之-- ...

  2. 【基础】python操作Word时,自动更新目录(二)

    系列文 python-docx-template包之----为文字自定义格式(一) python-docx-template包之----设置表格(二) python-docx-template包之-- ...

  3. win10必须禁用的服务_WIN10关闭自动更新的两种方法

    彻底关闭win10自动更新 背景 使用win10系统的朋友应该相对清楚,win10系统通常可以从系统接收系统更新补丁.尽管这可以在一定程度上维护win10系统的安全性,但并不是每个用户都喜欢频繁地更新 ...

  4. 实现Windows XP自动登录的两种方法

    实现Windows XP自动登录的两种方法 方法1: 在进入Windows XP桌面之前,每次都会出现一个用户登录界面,要求我们输入用户名与密码,可以加大了系统的安全性,也为多人共用一台电脑提供了方便 ...

  5. Windows XP自动登录的两种方法

    单击开始→运行,输入rundll32 netplwiz.dll,UsersRunDll 点确定后调出"用户帐户"设置窗口,然后在User (用户)选项中取消Users must e ...

  6. dapper mysql 批量_MySQL数据库之c#mysql批量更新的两种方法

    本文主要向大家介绍了MySQL数据库之c#mysql批量更新的两种方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 总体而言update 更新上传速度还是慢. 1:  简单的 ...

  7. 计算机word降序排列怎么做,word中怎么进行排序的两种方法

    word文档中表格除了作为我们的编辑和展示功能之外,还可以进行排序功能,十分方便,那么下面就由学习啦小编给大家分享下word中进行排序的技巧,希望能帮助到您. word中进行排序方法一: 步骤一:将光 ...

  8. vue 路由跳转页面打开新页面_vue-router跳转时打开新页面的两种方法

    vue-router跳转时打开新页面的两种方法 最近还是在痛苦的挣扎中 挣扎吧 记录一下在vue项目中如何实现跳转到一个新页面(一个比较简单又比较基础的问题了),有两个方法: 1.标签实现新窗口打开 ...

  9. arcgis用python字段自动编号,arcgis中字段自动编号的两种方法

    <arcgis中字段自动编号的两种方法>由会员分享,可在线阅读,更多相关<arcgis中字段自动编号的两种方法(4页珍藏版)>请在人人文库网上搜索. 1.精选文档关于ARCGI ...

最新文章

  1. springcloud-06-feign的使用
  2. (转)谷歌公开dopamine
  3. HTML5中本地数据库(SQLLite)的基础
  4. 在Google Cloud platform上创建Kubernetes cluster并使用
  5. sql 插入新数据 如何处理等字符_新手们还在到处找报表资料吗?Intouch SQL 数据库脚本给你安排...
  6. ceres-solver库使用示例
  7. 移动端布局,C3新增属性
  8. linux下的终端利器----tmux
  9. Knockout自定义绑定my97datepicker
  10. 降噪滤波器的简单使用
  11. 网件 无线打印机服务器,NETGEAR Genie让普通打印机实现Air print功能
  12. 唱响艾泽拉斯-Zetacola专辑
  13. 如何把计算机课讲得生动些,谈小学阶段如何上好计算机课(5页)-原创力文档...
  14. 国外LEAD联盟,S联盟被关联
  15. 那些我们对2019技术世界趋势的预测都说准了吗?
  16. Pyecharts数据可视化之折线图(阶梯图、平滑曲线图、面积图)、K线图、常用配置项
  17. centos查oracle版本命令,Linux操作系统查看系统信息命令
  18. nico老是显示服务器升级,Nico会员服务条款
  19. 单目标跟踪算法:Siamese RPN论文解读和代码解析
  20. Opencv去除高光的算法--Highlights Removal

热门文章

  1. 使用 amMap 轻松添加互动效果的 JavaScript 地图
  2. 学前端的你,还在迷茫吗?快看看这些前端学习网站吧
  3. 数字图像处理学习笔记(六)——数字图像处理中用到的数学操作
  4. java无名粉_使用JAVA为“无名的粉”写一个类,具体要求如下
  5. 大数据时代与多云时代:一个消亡,一个诞生
  6. 陈莉君老师写的中断絮说
  7. ubuntu 内网机器访问外网
  8. 网页打开慢的原因及处理办法
  9. 【LibRaw】原始图像解码库介绍(三)——数据结构
  10. 安装PyCrypto失败