問題
目前的excel 不像之前的excel了可以支持的數據量更大,可以支持支持1048576行,16384列。
之前使用poi讀取,直接報錯,使用excel 事件的方式讀取,還有不少的bug,關鍵是程序寫的很復雜。
解決方案
我們知道excel 文件實際上是一個壓縮包來的,我們將excel 直接改名為rar或zip文件。
我們可以將文件解壓出來。
我們可以看到excel 實際上是一堆xml文件的集合。
worksheets 中實際存了 這個excel的sheets數據。
但是excel 在存數據的時候,他會將字符串數據存在在sharedString.xml 文件中。
sharedString.xml 文件數據如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="6" uniqueCount="4"> <si> <t>guangzhou</t> </si> <si> <t>beijing</t> </si> <si> <t>hujun</t> </si> <si> <t>c</t> </si> </sst>
這個數據存放了字符串的數據。
sheet 表文件也是一個xml文件,格式如下圖:
我們查看xml文件可以得知。
這里0,1,2,3 存的是 sharedString.xml 字符串的下標。
數字和日期型數據是直接存放在sheets 數據中的。
日期型數據的存儲有些特殊
比如這個 他的日期實際是 2019-5-29日,這個是怎么計算的呢,他實際是從1900-0-0 開始加上43614天。
因此 明白了excel的結構 ,我們就很容易去實現讀excel的代碼,可以繞開poi哪些api。
直接讀取xml。
實現思路
1.將文件解壓。
2.讀取sharedString.xml 將數據讀取到list列表。
3.讀取sheet.xml文件數據,遍歷這個數據,將字符串的數據,去上面的列表中查找,其他類型的數據直接在sheet.xml 中讀取。