欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#獲取Word格式文檔頁數(shù)的方法

 更新時(shí)間:2025年09月23日 10:53:39   作者:Humbunklung  
在C#編程中,處理Microsoft Office文檔,特別是Word文檔,是一項(xiàng)常見的任務(wù),本文將詳細(xì)介紹如何使用C#獲取Word文檔的頁數(shù),這些功能通常在自動(dòng)化辦公流程、報(bào)表生成或文檔管理應(yīng)用程序中非常有用,需要的朋友可以參考下

1. 背景

有時(shí)候,我們需要獲取一個(gè)Word格式文檔(docx)的頁數(shù),甚至在某一頁做某些操作,如果我們使用COM+調(diào)用officewps這些商用軟件,是相當(dāng)方便的,而使用aspose.word這些商業(yè)庫,也是短短幾行代碼的事情。然而,當(dāng)程序跑在某些特定的環(huán)境(例如沒有Office軟件的環(huán)境),或者我們資金有限而又有道德潔癖(不愿意使用盜版),獲取docx文件頁數(shù),這種看似簡單的問題反而變得復(fù)雜,因?yàn)槲覀兂S玫拈_源庫poi/npoiOpenXML SDK等,并沒有提供這樣的操作。
本著“自己動(dòng)手,豐衣足食”的原則,那就自己手工寫代碼看看吧,順道把坑踩一遍。

2. docx是一個(gè)zip

既然是要自己寫代碼處理這種問題,那么我們要回到問題的本質(zhì)——word的docx文檔究竟是什么?.docx 文件本質(zhì)上就是一個(gè) ZIP壓縮包。我們將.docx 文件擴(kuò)展名改為.zip,然后使用解壓縮工具來打開它。解壓后,你會(huì)發(fā)現(xiàn)其中包含許多XML文件和媒體文件(如下圖),它們共同構(gòu)成了Word文檔的內(nèi)容和格式。

可見,我們可以從這對(duì)xml文件著手,解決問題,而Word的這種docx文檔有什么特點(diǎn)呢?我也請(qǐng)教了AI:

  • 基于 Open XML 標(biāo)準(zhǔn):.docx 格式是微軟Word(從2007版本開始)所使用的基于Office Open XML標(biāo)準(zhǔn)的文件格式。
  • 包含大量XML文件:與舊的二進(jìn)制格式的.doc文件不同,.docx 文件是一個(gè)包含多個(gè)XML文件的壓縮集合。
  • 主要內(nèi)容:解壓后,核心的文本內(nèi)容通常保存在 word/document.xml 文件中,而文檔的樣式信息、媒體文件等則分別存儲(chǔ)在其他文件夾或文件中。
  • 優(yōu)點(diǎn):這種基于XML和壓縮的格式使得文件更小,并且允許更靈活地訪問和編輯文檔的內(nèi)部結(jié)構(gòu)。

那么,我們的這個(gè)奇奇怪怪的獲取docx文檔頁數(shù)的方法,就從word/document.xml文件開始了。

3. 使用C#代碼解壓docx文檔

解壓這樣的文檔,并不復(fù)雜,直接用ZipFile這樣的庫即可,示例代碼如下:

var docxFile = $@"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}test.docx";
var extractedPath = $@"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}extracted";
var xmlPath = $@"{extractedPath}{Path.DirectorySeparatorChar}word{Path.DirectorySeparatorChar}document.xml";

if (File.Exists(docxFile))
{
    System.IO.Compression.ZipFile.ExtractToDirectory(docxFile, extractedPath, true); // 最后一個(gè)參數(shù)為true,目錄已存在則覆蓋
    Console.WriteLine($"Extracted {docxFile} to {extractedPath}");
}
else
{
    Console.WriteLine($"File {docxFile} does not exist.");
}

解壓后的目錄如下:

4. 那個(gè)自稱document的XML

進(jìn)入解壓后的word目錄了,我們可以找到document.xml文件,敢自稱document,也肯定是有點(diǎn)東西的,打開一看,確實(shí)名副其實(shí):

可見一個(gè)word文檔的整體脈絡(luò)以及主要的行文,都在這里面了。當(dāng)然,文檔里的圖片等資源也是記錄在這里,例如對(duì)某個(gè)資源的引用<a:blip r:embed="rId7"/>等,當(dāng)然這還牽涉到mediadocument.xml.rels中的引用關(guān)系等等,有機(jī)會(huì)再細(xì)說。那么,回到本次描述的“獲取文檔頁數(shù)”這個(gè)操作,就比較簡單了,只要我們找到里面的<w:lastRenderedPageBreak/>元素,問題就可以解決了。顧名思義,該元素是用于給word文檔分頁的,相當(dāng)于用它來“切香腸”,一刀分兩頁,兩刀分三頁,以此類推……

5. 查找并統(tǒng)計(jì)分頁標(biāo)簽

使用自帶的System.Xml庫,可以對(duì)xml文件進(jìn)行解析,查找并獲取<w:lastRenderedPageBreak/>,實(shí)現(xiàn)定位和統(tǒng)計(jì)等功能(本文就以統(tǒng)計(jì)為例)。

if (File.Exists(xmlPath))
{
    var xmlContent = File.ReadAllText(xmlPath);
    var xmlDoc = new System.Xml.XmlDocument();
    xmlDoc.LoadXml(xmlContent);

    var nsmgr = new System.Xml.XmlNamespaceManager(xmlDoc.NameTable);
    nsmgr.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

    var nodes = xmlDoc.SelectNodes("http://w:lastRenderedPageBreak", nsmgr);
    var cnt = nodes?.Count ?? 0;

    Console.WriteLine($"使用XML解析的方式找到 <w:lastRenderedPageBreak /> 節(jié)點(diǎn)數(shù)量: {cnt}");
    Console.WriteLine($"該文檔共有 {cnt + 1} 頁");
}
else
{
    Console.WriteLine($"File {xmlPath} does not exist.");
}

以本文中的測試文檔為例,文檔共7頁,查找并計(jì)算出來的頁數(shù)也是7頁,結(jié)果與實(shí)際一致。

到此這篇關(guān)于C#獲取Word格式文檔頁數(shù)的方法的文章就介紹到這了,更多相關(guān)C#獲取Word文檔頁數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#判斷字符是否為漢字的三種方法分享

    C#判斷字符是否為漢字的三種方法分享

    判斷一個(gè)字符是不是漢字通常有三種方法,第一種用 ASCII 碼判斷,第二種用漢字的 UNICODE 編碼范圍判 斷,第三種用正則表達(dá)式判斷,以下是具體方法
    2014-01-01
  • c# 9.0新特性——模塊初始化器

    c# 9.0新特性——模塊初始化器

    這篇文章主要介紹了c# 9.0新特性——模塊初始化器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#9.0,感興趣的朋友可以了解下
    2020-11-11
  • C#實(shí)現(xiàn)貪吃蛇小游戲

    C#實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#中事件的動(dòng)態(tài)調(diào)用實(shí)現(xiàn)方法

    C#中事件的動(dòng)態(tài)調(diào)用實(shí)現(xiàn)方法

    這篇文章主要介紹了C#中事件的動(dòng)態(tài)調(diào)用實(shí)現(xiàn)方法,對(duì)比傳統(tǒng)思路優(yōu)劣給出了一個(gè)新的解決方案,需要的朋友可以參考下
    2014-09-09
  • C# DateTime與時(shí)間戳轉(zhuǎn)換實(shí)例

    C# DateTime與時(shí)間戳轉(zhuǎn)換實(shí)例

    本篇文章主要介紹了C# DateTime與時(shí)間戳轉(zhuǎn)換實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • C#中的事務(wù)用法實(shí)例分析

    C#中的事務(wù)用法實(shí)例分析

    這篇文章主要介紹了C#中的事務(wù)用法,以一個(gè)簡單實(shí)例形式分析了C#創(chuàng)建及使用事物的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • 淺談c#中const與readonly區(qū)別

    淺談c#中const與readonly區(qū)別

    C#引入了readonly修飾符來表示只讀域,const來表示不變常量。顧名思義對(duì)只讀域不能進(jìn)行寫操作,不變常量不能被修改,這兩者到底有什么區(qū)別呢?
    2015-06-06
  • c#多進(jìn)程通訊的實(shí)現(xiàn)示例

    c#多進(jìn)程通訊的實(shí)現(xiàn)示例

    本文主要介紹了c#多進(jìn)程通訊的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 詳解如何使用C#獲取計(jì)算機(jī)信息

    詳解如何使用C#獲取計(jì)算機(jī)信息

    這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)獲取計(jì)算機(jī)信息,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2024-10-10
  • 用NPOI創(chuàng)建Excel、合并單元格、設(shè)置單元格樣式、邊框的方法

    用NPOI創(chuàng)建Excel、合并單元格、設(shè)置單元格樣式、邊框的方法

    本篇文章小編為大家介紹,用NPOI創(chuàng)建Excel、合并單元格、設(shè)置單元格樣式、邊框的方法。需要的朋友參考下
    2013-04-04

最新評(píng)論