POI解析docx与doc文档中的难点归纳
最近需求是寫一個將docx和doc解析后轉換為json格式輸入到json臨時文件中的功能,然后前端讀取json文件去渲染做到和文檔內容一致,在這里歸納下難點,以及國內網站基本沒有相關demo的點。
先說下docx和doc的區別吧,區別實際上就是一個好用而另一個反人類,現在創建一個新的文檔,office都不會給你選擇,直接默認docx,除非你另存為doc或者直接修改后綴,這樣的原因是doc這種二進制存儲的玩意過于反人類:
docx文件修改后綴為zip后解壓,你可以在這個文件夾里面看到所有文檔內容信息,樣式,圖片之類的,doc的話相同操作你啥都看不到。這樣就導致你使用poi解析docx和doc的難易程度完全差得十萬八千里。
另外poi用來解析doc的hwpf包也寫的很亂,對比poi用來解析docx的xwpf包來說,xwpf包看底層會有方法說明,而且命名方式可以讓你就算沒有方法說明,大致也很容易看得懂這個方法用來干什么的,但是hwpf包就不一樣,一堆枚舉,方法也很凌亂,阿帕奇官網對于方法的說明幾乎沒有,再加上國內使用poi的本來就少,大多直接用阿里的poi-tl之類的,而且用poi解析文檔的更是少之又少,大多資料都是解析excel的,少之又少里面大多又是解析docx的,doc的又是又是少之又少。希望自己接下來的一些補充能夠在國內論壇里貢獻一點資料吧(雖然很冷門,但是希望以后有和我做一樣事情的程序員能少走點彎路)
最后因為我應屆入職不久,代碼可能比較稚嫩,希望能給你帶來幫助,輕噴。
docx,doc的解析難點
首先我覺得比較偏門資料比較少的有五個:
一個是解析公式,我所做的需求是將公式轉換為latex字符串儲存,就是比如將下圖這種轉換為一個字符串:
x=\frac{-b\pm \sqrt{{b}^{2}-4ac}}{2a}
二是遍歷docx文檔。單獨解析不同的模塊,如解析出文檔里所有的圖片,解析文檔中所有表格,解析文檔中的所有的文本,這很簡單,docx這些方法csdn或者博客園都能找到。但是,這些解析出來的數據結構是沒有定位的,你不知道圖片與段落之間的關系,表格與段落之間的關系,題注與圖片的位置關系。所以你必須要從頭到尾去遍歷,才能夠知道這些之間的位置關系。
三是遍歷doc文檔,相信我,這個比docx的遍歷冷門的多,自己不斷嘗試的方法摸索出來的,可能還沒達到普遍性,但是基本能泛用。
四是將docx和doc文檔中的復雜表格轉換為html字符串,這個也很冷門,網上資料大多是整個文檔全轉為html,或者是讀取簡單地,方方正正,n*m的表格,沒有單獨處理復雜表格轉換為html的的。
主要思路是解析后通過自己寫的方法拼接為html,docx的表格轉html字符串是在網上找的,poi解析docx用的xwpf包里面對于表格有專門的類讀取它的信息,能夠得到很完善的表格信息,所以拼接簡單,poi解析doc所用的hwpf包解析doc中的表格,沒有這些東西,所以很難讀取解析復雜表格后拼接為html。這個后面會單獨說。
五是編號列表,docx的編號列表網上能找到,但是也很冷門那種,太難找了,而doc的網上根本就沒有,方法是靠自己看hwpf底層加上不斷測試以及閱讀office官網給的一些doc文檔信息寫出來的。
這里要說一下:docx文檔和doc文檔實際上是沒有存儲編號的文本的。
查了下相關資料,說列表段落的編號文本不是硬編碼,所以你去文檔底層里面是找不到具體的文本內容。xwpf讀取docx中列表段落的編號的文本內容是在csdn上找到的,而doc是自己摸索加上office官方給的文檔結合推導出來的方法,但是方式都是大同小異,都不是通過poi直接讀出來的,而是通過poi獲取相關信息,然后在方法里面匹配后進行拼接,從而獲取對應的列表段落的編號文本內容,類似于下列圖中所示的編號內容:如1. 1) a) 等。
這些都是比較冷門的讀取,至少我在做的時候很多都找不到,stack over flow上去詢問也很多都沒解決,有的是靠自己測試得出的結果。
有時間會將代碼上傳github并且分享相關jar包,jar包的功能是給要解析的docx文件路徑或doc文件路徑,以及輸出臨時文件位置(本來是只要給文件路徑,自動生成一個temp文件夾在jar包相同的目錄下,然后在temp文件夾下生成相應的解析后的json臨時文件,但是老大不讓這么做),生成的json文件是順序從頭到尾的,前端解析后渲染就可以復原這個文檔內容,文本樣式什么都有。
總結
以上是生活随笔為你收集整理的POI解析docx与doc文档中的难点归纳的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结构性思维原则
- 下一篇: HYSBZ 3991 寻宝游戏