word文档中有页面数(不打开Word文档获取总页数)
word文档中有页面数(不打开Word文档获取总页数)
2024-07-01 06:06:36  作者:是是是我错  网址:https://m.xinb2b.cn/sport/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里面不相等的情况了,因为不是文件有足够的页数,文件里的所有流都会实时更新

  • 生活是一本书作文(生活是一本书作文范文)
  • 2024-07-01生活是一本书作文范文生活是本无字的书,在那里,我们可以学到许多书本上学不到的知识,懂得许多做人的道理……那一次,我就从“生活之书”中感悟到:坚持,必能成功星期天,我做完了作业,与爸爸一起去钓鱼因为是第一次,我不免有些激动。
  • 资本主义价值观通俗点(资本主义的本质与人类社会的发展)
  • 2024-07-01资本主义的本质与人类社会的发展资本主义的本质是不停地扩张资本资本的本性就是如此如果把资本比作一个生物的话,它的本能就是不断地壮大自己同样的如果把资本看做一个生物的话,当它“壮大”到极致后,它就会走上逐步灭亡的道路,如同这个世界上一。
  • 宇宙法则与生命规律(关于宇宙法则之书)
  • 2024-07-01关于宇宙法则之书“书中自有黄金屋,书中自有千钟粟,书中自有颜如玉”人类社会在飞速发展,人的智慧在迅猛提升,生活节奏加速,认知水平改变,现代人们对于读书的概念几乎模糊,读书的概念被日新月异的科学技术碾压得粉碎但书依然有。
  • 营养土可以种草莓吗(营养土种草莓注意事项)
  • 2024-07-01营养土种草莓注意事项营养土是可以种植草莓的,但是不建议那么做,因为营养土的肥量是比较大的,如果是草莓小苗的话,很容易出现肥害、烧根甚至死亡的如果使用的话,最好是少量的营养土和园土、珍珠岩混合,让它的肥量变小之后再使用。
  • 废物利用塑料瓶制作花瓶步骤(塑料瓶的变废为宝小妙招)
  • 2024-07-01塑料瓶的变废为宝小妙招传承手工艺术,放飞指尖梦想,每一节教学我们都会认真对待!只为传递手工技艺,创意源于生活,细节决定品质,今天为大家分享如何用塑料瓶制作孔雀花瓶的方法,难度2颗星,按照步骤学习,很快就能学会,喜欢DIY生。
  • 金秋9月幼儿园(月团圆悦童年)
  • 2024-07-01月团圆悦童年月团圆,悦童年——诺亚舟春江幼儿园中秋味道一年一度,中秋又至说到中秋节,古诗佳句自然是信手拈来人们往往会想起李白的“举头望明月,低头思故乡”也会想起张九龄的“海上生明月,天涯共此时”更会想起苏轼流芳千。
  • 熊猫直播刺激战场吃鸡(手游主播刺激战场遇55开)
  • 2024-07-01手游主播刺激战场遇55开  要说这两天手游界有什麼新的游戏呈现的话,我置信一定就是两款绝地求生正版吃鸡手游了它们不断都遭到了大家的关注,其中一款是全军反击,另一款是安慰战场两款游戏都从根本上复原了端游的地图,配备,操作等等 。
  • 斯里兰卡佛教之谜(斯里兰卡记行二十九)
  • 2024-07-01斯里兰卡记行二十九今天,是我们在斯里兰卡旅行的最后一天,冈嘎拉马寺是科伦坡这一站的最重要景点这是千真万确的真的象头哦!冈嘎拉马寺是斯里兰卡最重要的寺庙之一,融合斯里兰卡、泰国、印度和中国建筑特点,寺庙拥有图书馆、博物馆。
  • 汽车修理工中级考试题库(2022汽车修理工中级)
  • 2024-07-012022汽车修理工中级题库来源:安全生产模拟考试一点通公众号小程序2022年汽车修理工(中级)复训题库是汽车修理工(中级)复审题库的新全考试题型!2022汽车修理工(中级)考试题模拟考试平台操作根据汽车修理工(中级)考前押。
  • 欧洲文艺复兴但丁的代表作(文艺复兴运动的代表人物)
  • 2024-07-01文艺复兴运动的代表人物但丁(1265-1321)是文艺复兴的先驱,他的长篇诗作《神曲》分“地狱”“炼狱”“天堂”三部分作者借梦游三界描写现实主义生活中的各色人物,抨击教会的贪婪腐败把许多主教僧侣甚至教皇都打入地狱,表达了市。