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

  最近的项目中有一个功能点为:根据分析数据库并生成报告。不过不是大数据、数据挖掘之类,报告的内容、组织方式都是事先固定下来的。实现的方式为,在普通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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值