word文档中有页面数(不打开Word文档获取总页数)
word文档中有页面数(不打开Word文档获取总页数)
2024-05-28 10:56:58  作者:是是是我错  网址:https://m.xinb2b.cn/know/bwz446413.html

word文档中有页面数(不打开Word文档获取总页数)(1)

打开word文档获取总页数的方法很多:

Selection.Information(wdNumberOfPagesInDocument)ActiveDocument.ComputeStatistics(wdStatisticPages)ActiveDocument.ActiveWindow.ActivePane.Pages.CountActiveDocument.BuiltinDocumentProperties(wdPropertyPages)

当然以上方法里,第2和第4两种方法更方便封装

以上方法缺点是需要打开文件才能获取页数

优点是获取到的页数是准确的

以下讲一下解析2007以上文件的方法来获取页数,需要用到一个typelib(oleexp.tlb)

因为发链接限制比较多,就不发链接了

引用tlb之后,测试一下代码:

Private Declare Function SHParseDisplayName Lib "shell32" (ByVal pszName As Long, ByVal IBindCtx As Long, ByRef ppidl As Long, sfgaoIn As Long, sfgaoOut As Long) As Long

Private Declare Function ILFree Lib "shell32" (ByVal pidlFree As Long) As Long

Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long

Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (Optional ByVal pszStrPtr As Long, Optional ByVal Length As Long) As String

Private Const CLSID_Zip = "{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}"

Private Const IID_IShellExtInit = "{000214E8-0000-0000-C000-000000000046}"

Function GetPageCount(ByVal strFilePath As String) As Long 'xml文档docx

Dim CLSID As UUID

Dim iid As UUID

Dim IExt As oleexp.IShellExtInit

Dim IPF As oleexp.IPersistFolder2

Dim iStg As oleexp.IStorage

Dim iStat As oleexp.STATSTG

Dim docProps As oleexp.IStorage

Dim appxml As oleexp.IStream

Dim pidl As Long

Dim cb As Long

Dim buf() As Byte

Dim strTemp As String

Dim arr() As String

CLSIDFromString CLSID_Zip, CLSID

CLSIDFromString IID_IShellExtInit, iid

If CoCreateInstance(CLSID, Nothing, 1&, iid, IExt) <> 0 Then GoTo lExit

Set IPF = IExt

SHParseDisplayName StrPtr(strFilePath), 0, pidl, 0, 0

IPF.Initialize pidl

ILFree pidl

Set iStg = IPF

Set docProps = iStg.OpenStorage("docProps", 0, STGM_READ, 0, 0)

Set appxml = docProps.OpenStream("app.xml", 0, STGM_READ, 0)

appxml.stat iStat, STATFLAG_NOOPEN

ReDim buf(10000 * iStat.cbSize - 1)

cb = appxml.Read(buf(0), UBound(buf) 1)

If cb Then

strTemp = SysAllocStringByteLen(VarPtr(buf(0)), lstrlenA(VarPtr(buf(0))))

End If

mySplit strTemp, arr, "</Pages>" '内置Split的效率不能忍

mySplit arr(0), arr, "<Pages>"

GetPageCount = arr(1)

lExit:

End Function

Public Sub mySplit(ByVal Expression$, ResultSplit$(), Optional Delimiter$ = " ")

' By Chris Lucas, cdl1051@earthlink.net, 20011208

Dim c&, SLen&, DelLen&, tmp&, Results&()

SLen = LenB(Expression) \ 2

DelLen = LenB(Delimiter) \ 2

If SLen = 0 Or DelLen = 0 Then ' Bail if we were passed an empty delimiter or an empty expression

ReDim Preserve ResultSplit(0 To 0)

ResultSplit(0) = Expression

Exit Sub

End If

ReDim Preserve Results(0 To SLen) ' Count delimiters and remember their positions

tmp = InStr(Expression, Delimiter)

Do While tmp

Results(c) = tmp

c = c 1

tmp = InStr(Results(c - 1) 1, Expression, Delimiter)

Loop

ReDim Preserve ResultSplit(0 To c) ' Size our return array

If c = 0 Then ' Populate the array

ResultSplit(0) = Expression ' lazy man's call

Else

ResultSplit(0) = Left$(Expression, Results(0) - 1) ' typical call

For c = 0 To c - 2

ResultSplit(c 1) = Mid$(Expression, Results(c) DelLen, Results(c 1) - Results(c) - DelLen)

Next c

ResultSplit(c 1) = Right$(Expression, SLen - Results(c) - DelLen 1)

End If

End Sub

代码写的比较粗糙,直接从内存中获取app.xml文件,并直接读取里面的<Pages>页数</Pages>字段

MySplit只是个提高自带Split函数效率的方法

这样读取的方法有一个确定,当文档的页数跟app.xml文件里的页数不对等时,这里获取到的当然就是错的。

为什么会有文档页数和app.xml里面不相等的情况了,因为不是文件有足够的页数,文件里的所有流都会实时更新

  • 10个美到窒息的旅行地(低调到0攻略的避世天堂)
  • 2024-05-29低调到0攻略的避世天堂这是我们的一个新专题,和阿里巴巴乡村振兴基金一起做的今年阿里巴巴公益发布的热土计划中将打造10个乡村旅游标杆县,将景点、酒店、旅游路线等搬到线上,策划营销活动这其中很多都是风景秀美的欠发达县域,如湘西。
  • 滚筒洗衣机怎么清洗内部垃圾(滚筒洗衣机的优缺点是什么)
  • 2024-05-29滚筒洗衣机的优缺点是什么市面上关于洗衣机的款式有很多种,其中包括滚筒洗衣机,那它的优缺点是什么呢?PChouse带大家一起了解下吧优点:1、滚筒洗衣机由微电脑控制,衣物无缠绕、洗涤均匀、磨损率要比波轮洗衣机小10%,可洗涤羊。
  • 霸气小组名字和押韵口号(霸气小组名字精选)
  • 2024-05-29霸气小组名字精选勇于争先组:预习是展示之本,展示是学习之魂欢乐城堡组:我们快乐,我们永远是第一!超越自我组:每节展示一分钟,必定改变你一生冲锋队,团队口号:冲锋冲锋,冲向巅峰,精神:团结一致,铸就辉煌铸就辉煌!实力组。
  • 优盘怎样使用
  • 2024-05-29优盘怎样使用步骤/方式1以Windows10系统电脑为例,将U盘插入电脑的USB口步骤/方式2电脑读取U盘,打开此计算机就可以看到U盘储存空间步骤/方式3例如右击电脑的一个文件,选择复制步骤/方式4在进入优盘的文。
  • 眼睛出现很多红血丝是什么原因(眼睛为什么总出现红血丝)
  • 2024-05-29眼睛为什么总出现红血丝在健康人的眼睛里,事实上也布满了特别微细的血管,只是因为特别的细小,我们肉眼有时不容易发现造成眼睛出现红血丝的原因有很多,大部分人会认为,也许是没有休息好,好好睡一觉就可以了真的如此吗?眼睛为什么总是。
  • 蒜蓉菠菜的做法(怎么做蒜蓉菠菜)
  • 2024-05-29怎么做蒜蓉菠菜食材:菠菜300g、蒜10g、盐3g、花生油15ml菠菜洗净控水,切段蒜剁碎热锅下油,先放入一半的蒜末爆香再放入菠菜炒至菠菜开始变软放入另一半蒜末,盐旺火翻炒10秒钟关火。
  • 正定古城遗址在哪儿(石家庄有座宋古城保存完好)
  • 2024-05-29石家庄有座宋古城保存完好在河北石家庄有许多大家耳熟能详的名胜古迹,比如正定古城、赵县赵州桥、《卧虎藏龙》取景地苍岩山等等,但是还有一座宋古城,包括许多石家庄本地人都不知道,它就是位于井陉县的天长镇它距离省石家庄市区50公里,。
  • 王者荣耀职业选手比心(王者荣耀电竞综艺战至巅峰开播了)
  • 2024-05-29王者荣耀电竞综艺战至巅峰开播了《王者荣耀》是目前最火的手机游戏之一,拥有极高的人气和海量的用户无数活动都与《王者荣耀》进行过联动合作,近日号称“中国首档全明星王者荣耀电竞热血养成真人秀”的综艺节目《战至巅峰》就出现在了大家的面前6。
  • 奔跑吧第六季沙溢说李晨是白痴(奔跑吧李晨流泪)
  • 2024-05-29奔跑吧李晨流泪刚刚看完《奔跑吧》最新一期节目,有的人可能会说,都过去这么久了,才看实际上小编上次只看了其中一点片段,没有从头观看,今天看过整期节目后,非常想写一下小编的真实感受这期节目太好看,节目组用意深刻了希望小。
  • 拍摄杨梅好看的短(百亩樱桃花开烂漫)
  • 2024-05-29百亩樱桃花开烂漫来源:甘肃广电-视听甘肃近日,甘谷县八里湾镇的百亩樱桃花如期盛放,山坳间蕴满了浓浓春意放眼望去,一树树的樱桃花开,随风肆意又含蓄典雅,给春天增添了一道亮丽的色彩甘肃广电总台全媒体记者:宁永学天水台柴琪。