真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

nodejs實現(xiàn)一個word文檔解析器思路詳解

之前項目里遇到一個需求,需要前端上傳一個word文檔,然后后端提取出該文檔的指定位置的內容并保存。這里后端用的是nodejs,開始接到這個需求,發(fā)現(xiàn)無從下手,主要是沒有處理過word這種類型的文檔,怎么解析? Excel倒是有相關的庫可以用,而且很簡單

成都網(wǎng)站建設公司更懂你!成都創(chuàng)新互聯(lián)只做搜索引擎喜歡的網(wǎng)站!成都網(wǎng)站制作前臺采用搜索引擎認可的DIV+CSS架構,全站HTML靜態(tài),H5高端網(wǎng)站建設+CSS3網(wǎng)站,提供:網(wǎng)站建設,微信開發(fā),微信小程序定制開發(fā),商城網(wǎng)站定制開發(fā),app軟件定制開發(fā),空間域名,服務器租售,網(wǎng)站代托管運營,微信公眾號代托管運營。

思路

搜索了好一會兒,在npm上發(fā)現(xiàn)了一個叫做 adm-zip 的包,這個包可以解壓縮word文檔,原來word文檔也是可以解壓縮的,之前一直不知道,通過如下代碼就可以將word文檔解壓縮,并進一步提取內容

var admZip = require('adm-zip');
const zip = new admZip('test.docx');
//將該docx解壓到指定文件夾result下
zip.extractAllTo("./result", /*overwrite*/true);

首先我們新建一個docx文檔,內容如下

nodejs實現(xiàn)一個word文檔解析器思路詳解 

然后運行上述代碼進行解壓縮,得到如下的文件,由下圖可以看出生成了好幾個文件夾,word的內容其實是在word文件夾里的document.xml文件內(這里解壓縮后其實源文件還在,并沒有消失)

nodejs實現(xiàn)一個word文檔解析器思路詳解 

進入word文件夾后的內容

nodejs實現(xiàn)一個word文檔解析器思路詳解 

我們繼續(xù)打開document.xml文件來一探究竟里面到底是啥?注意要用瀏覽器直接打開,如果用ide打開顯示出的所有內容都在一行,無法閱讀!

nodejs實現(xiàn)一個word文檔解析器思路詳解 

上圖只是word文檔的一部分,會發(fā)現(xiàn)word文檔內看著只有幾段文字,但是xml中卻是長篇大論,仔細分析下也很正常,xml全稱可擴展標記語言,其被設計為傳輸和存儲數(shù)據(jù),它僅僅是一個純文本的表示,而word中內容格式千變萬化,肯定需要一種方法來有效描述這些內容的格式,因此采用了xml來描述

我們嘗試一下將 測試文檔 四個字加粗變色傾斜字體,如下圖

nodejs實現(xiàn)一個word文檔解析器思路詳解 

然后再進行解壓縮,得到docuemnt.xml并查看對應的內容,如下

nodejs實現(xiàn)一個word文檔解析器思路詳解 

這就很明顯了, 表示文字加粗, 表示文字傾斜,
表示文字的顏色,所以這么4個字就需要這幾行xml來描述,因此長篇大論的xml也就不足為奇

提取內容

上面說到了xml僅僅是一個文本的表示,我們可以用如下代碼讀取整個xml的內容,結果是一個 string

var contentXml = zip.readAsText("word/document.xml");

接下來是重點,如何提取我們想要的內容呢,答案是正則表達式,首先我們得分析一下word文檔的結構,word文檔其實是由叫做 Paragraph 的段落所構成,在vb中可以很輕松的獲取并修改段落,官網(wǎng)傳送門點此

nodejs實現(xiàn)一個word文檔解析器思路詳解 

那么到底怎么樣才是一個 Paragraph 呢,其實很簡單,仔細觀察word文檔,見到下圖中的小箭頭了么,每個小箭頭前面的內容就是一個段落,那么下圖中一共有16個 Paragraph ,當然有些段落是空的,沒有任何內容

nodejs實現(xiàn)一個word文檔解析器思路詳解 

我們再來研究xml的結構,收起展開的xml,如下圖,發(fā)現(xiàn) 這么個標簽就是表示的一個段落,中間還有些

藏在表格內,這么一看表格前面3個段落,后面3個段落,和上圖是對應的

nodejs實現(xiàn)一個word文檔解析器思路詳解 

因此, 我們就可以提取出每個段落的文本并返回一個數(shù)組,每一項就是一個段落的內容 ,這樣就能夠完整的解析出整個word的內容,關鍵在于如何提取每個 的內容,我們繼續(xù)展開一個 進行觀察,如下圖,發(fā)現(xiàn)內容雖多,其實文本都保存在 中間,因此思路就清晰了, 首先用正則表達式提取出所有的內容,再針對每個的內容,進行進一步正則提取,提取出其里面所有的內容,并拼接在一起構成一個段落的總內容

nodejs實現(xiàn)一個word文檔解析器思路詳解 

具體代碼

下面是具體的提取代碼

//參數(shù)是word文件名,第二個參數(shù)是回調表示解析完成
var parser = function parseWordDocument(absoluteWordPath,callback){
 //返回內容的數(shù)組
 var resultList = [];
 //如果文件存在
 fs.exists(absoluteWordPath, function(exists){
 if(exists){
 //解壓縮
 const zip = new admZip(absoluteWordPath);
 //將document.xml(解壓縮后得到的文件)讀取為text內容
 var contentXml = zip.readAsText("word/document.xml");
 //正則匹配出對應的里面的內容,方法是先匹配,再匹配里面的,將匹配到的加起來即可
 //注意?表示非貪婪模式(盡可能少匹配字符),否則只能匹配到一個
 var matchedWP = contentXml.match(/.*?<\/w:p>/gi);
 //繼續(xù)匹配每個里面的,這里必須判斷matchedWP存在否則報錯
 if(matchedWP){
 matchedWP.forEach(function(wpItem){
  //注意這里的匹配,有可能是這種格式,需要特殊處理
  var matchedWT = wpItem.match(/(.*?<\/w:t>)|(]*?>.*?<\/w:t>)/gi);
  var textContent = '';
  if(matchedWT){
  matchedWT.forEach(function(wtItem){
  //如果不是格式
  if(wtItem.indexOf('xml:space')===-1){
  textContent+=wtItem.slice(5,-6);
  }else{
  textContent+=wtItem.slice(26,-6);
  }
  });
  resultList.push(textContent)
  }
 });
 //解析完成
 callback(resultList)
 }
 }else{
 callback(resultList)
 }
 });
};

注意一下如果段落前有空格,那么 的格式是不同的,如下,多了這個space描述,所以需要特殊處理

代碼量其實很少,關鍵在于正則的編寫,上述docx文檔提取后的輸出結果如下

nodejs實現(xiàn)一個word文檔解析器思路詳解 

最后我把這個工具寫成了一個npm包,地址點這里


網(wǎng)頁題目:nodejs實現(xiàn)一個word文檔解析器思路詳解
URL分享:http://weahome.cn/article/pcidps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部