怎么快速取得word文档的结构?(集合遍历典型问题)

hugebrush 2014-05-04 11:45:50
加精
我目前用的办法是遍历文档的段落,根据各段落outlinelevel属性建立文档结构,但这种方法效率非常低,我处理一个1000多页的文档要几十分钟,而word打开同一个文档,3、4秒钟就能在导航窗格中显示出文档结构,很显然word有其他方式取得文档结构。怎么用VBA快速取得word文档结构?
...全文
2352 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
ky8908 2014-12-22
  • 打赏
  • 举报
回复
楼主你好,目前我跟你有非常相似的需求,能告知一下你最终的解决办法吗?我目前也是循环段落进行标记,速度太慢。
伊顺鸣 2014-06-02
  • 打赏
  • 举报
回复
凡走過,必留下我的足跡
u011120098 2014-05-31
  • 打赏
  • 举报
回复
之前用poi做过多媒体整合这类东西
虎子8 2014-05-30
  • 打赏
  • 举报
回复
学习了
add825 2014-05-30
  • 打赏
  • 举报
回复
好东西,谢谢分享!
彭先绪 2014-05-29
  • 打赏
  • 举报
回复
很全面啊 看的时候很方便找 幸苦了
朝露昙花 2014-05-29
  • 打赏
  • 举报
回复
好材料,谢谢分享!
lewit 2014-05-29
  • 打赏
  • 举报
回复
谢谢,学习了。
lhw7791086 2014-05-29
  • 打赏
  • 举报
回复
hanbingyi406213 2014-05-28
  • 打赏
  • 举报
回复
word做的 好用不 试试手
nettman 2014-05-28
  • 打赏
  • 举报
回复
bcrun 2014-05-16
  • 打赏
  • 举报
回复
引用 13 楼 hugebrush 的回复:
经测试,Application.Visible = False的情况下,selecion.movedown 的速度是Application.Visible = true的两倍 用for i = 1 to paragraphsCount的方式遍历段落,速度和Application.Visible = False的情况下的selection.movedown 一样。 用foreach 遍历段落,速度是用for i = 1 to paragraphsCount 方式的6倍。等有时间我在我的文档上测试效果。
注意,这两种方式遍历的耗时比应该不是等比例的,随着要遍历集合规模的增大,相关倍数应该是越来越大的。我看你这测得6倍时用的是较小的集合。
引用 14 楼 hugebrush 的回复:
文档段落多是因为里面有大量表格,表格的一个单元格至少包含一个段落。
嗯,那就要看你的总体设计了,我估计单元格里的段落应该不会是大纲的一部分,可以直接跳过去吧。
bcrun 2014-05-16
  • 打赏
  • 举报
回复
引用 15 楼 jiangsheng 的回复:
>用foreach 遍历段落,速度是用for i = 1 to paragraphsCount 方式的6倍 人家不是数组,有可能是链表。能用foreach 就用foreach 。
确实,估计集合类用链表实现的多,包括VB6中的collection类,以前就经常发生有人遍历这个类的对象时,忘了用foreach,结果速度很慢的情况。
蒋晟 2014-05-16
  • 打赏
  • 举报
回复
>用foreach 遍历段落,速度是用for i = 1 to paragraphsCount 方式的6倍 人家不是数组,有可能是链表。能用foreach 就用foreach 。
hugebrush 2014-05-15
  • 打赏
  • 举报
回复
引用 11 楼 bcrun 的回复:
确实,WORD打开稍大一点的文档,时间就要10秒以上,哪怕只有几百页。 你2000多页的文档就有16万多个段落太夸张了吧,一页有80段。是多个文档合计的段落数吧。 不管怎么样,考虑到效率问题,你应该改用for each这样的方式来遍历链表结构。我不敢说完全看懂了你关于具体读嵌套结构需求的解释,但还是感觉,没理由不采用for each遍历Document.Paragraphs的方式来实现,所以建议先试下这样做。 另外,你竟然使用selection来频繁改变当前光标位置,速度慢更是毫无疑问了。
文档段落多是因为里面有大量表格,表格的一个单元格至少包含一个段落。
hugebrush 2014-05-15
  • 打赏
  • 举报
回复
经测试,Application.Visible = False的情况下,selecion.movedown 的速度是Application.Visible = true的两倍 用for i = 1 to paragraphsCount的方式遍历段落,速度和Application.Visible = False的情况下的selection.movedown 一样。 用foreach 遍历段落,速度是用for i = 1 to paragraphsCount 方式的6倍。等有时间我在我的文档上测试效果。
赵4老师 2014-05-12
  • 打赏
  • 举报
回复
有一个加速技巧:
Application.Visible = False
hugebrush 2014-05-11
  • 打赏
  • 举报
回复
谢谢,这个方法不适合我的情况,我处理的文档中,有些标题只设置大纲级别,没有应用标题样式,这个方法扫不出这些标题。
引用 6 楼 spt_petrolor 的回复:
用word提供的“查找”-“定位”,定位目标为“标题”,可以迅速在文档中定位到任意标题(1,2,3.。级) 宏为: Selection.GoTo What:=wdGoToHeading, Which:=wdGoToNext, Count:=1, Name:="" 一般标题不会太长吧?我这么理解,标题就一行吧。

    Selection.GoTo What:=wdGoToHeading, Which:=wdGoToNext, Count:=1, Name:=""
     Selection.EndKey Unit:=wdLine, Extend:=wdExtend
    Debug.Print Selection.Style, Selection.Text
上面的代码从当前位置找到一个标题,选择整个行,并打印这个行的标题级别和标题内容。。。 如果你一开始就定位到文档的开始处,经过多次执行,就可以得到整个大纲了。 不知道是否满足你的要求? 下来就是把宏转为vb代码
hugebrush 2014-05-11
  • 打赏
  • 举报
回复
谢谢版主帮助!非常抱歉,前面有其他事情忙着,没得看论坛。 很抱歉,我处理的文档需要保密,不便公开,不能提供给大家测试。可以说一下文档的规模,我要分析的最大的文档有2000多页,共16万多个段落,用word打开这个文件,在页面视图下直接通过导航窗口跳转到1000页之后,word都会在分页过程中死掉,现在我只能用草稿视图看。我用我扫面过这个文档的标题,耗时太长了,没扫描完,已经扫出5000多个标题。 现在代码没在身边,我说一下我的算法: 我需要知道标题的嵌套关系,因此是用selection.movedown wdparagraph从头至尾扫描各段落,把扫描到的标题的起始字符、大纲级别、编号及文字依次写入一个excel文件中,每个标题在excel表格中占一行。 我不能确认document.paragraphs中的段落是否按在文档上出现的先后次序排列,没有采用遍历document.paragraphs的方式。前面测试其他功能的时候,遍历过document.paragraphs,对于一份1000多页的文档,也耗时几十分钟。
bcrun 2014-05-11
  • 打赏
  • 举报
回复
确实,WORD打开稍大一点的文档,时间就要10秒以上,哪怕只有几百页。 你2000多页的文档就有16万多个段落太夸张了吧,一页有80段。是多个文档合计的段落数吧。 不管怎么样,考虑到效率问题,你应该改用for each这样的方式来遍历链表结构。我不敢说完全看懂了你关于具体读嵌套结构需求的解释,但还是感觉,没理由不采用for each遍历Document.Paragraphs的方式来实现,所以建议先试下这样做。 另外,你竟然使用selection来频繁改变当前光标位置,速度慢更是毫无疑问了。
加载更多回复(8)

2,462

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧