使用SSZipArchive解壓excel文件獲得一個文件锋拖,SSZipArchive解壓的時候會指定一個路徑,解壓完成的文件通過路徑獲得,文件夾的目錄是這樣的
當前解析的表格如下:
這里只需要關注xl這個文件夾垒在,接下來解釋下每個文件夾對應的每個xml的作用。
-----------------------------------------分割線---------------------------------------------
1.解析sheet
上圖中這兩個sheet1和sheet2分別代表了excel中的2018.11.12-2018.11.17 和 2018.11.12-2018.11.17 场躯。 需要我們解析拿到數(shù)據(jù)谈为。
<cols>
<col min="1" max="1" width="13" customWidth="1"/>
<col min="2" max="2" width="15" customWidth="1"/>
<col min="3" max="3" width="16.83203125" customWidth="1"/>
<col min="4" max="4" width="16.6640625" customWidth="1"/>
<col min="5" max="5" width="16" customWidth="1"/>
</cols>
這個只是表示了excel每個col(單元格)的寬度踢关,不用管。
<sheetData>
<row r="1" spans="1:5" ht="18">
<c r="A1" s="1" t="s">
<v>0</v>
</c>
<c r="B1" s="1" t="s">
<v>1</v>
</c>
<c r="C1" s="5" t="s">
<v>2</v>
</c>
<c r="D1" s="1" t="s">
<v>3</v>
</c>
<c r="E1" s="1" t="s">
<v>4</v>
</c>
</row>
</sheetData>
<row>...</row>里面代表了每一行签舞,
<c ...>...</c> 代表了一個單元格
r="A1" 代表了這個單元格是在excel中的A1位置秕脓。
s 這個沒用到所以沒有研究,有興趣的可以查一下吠架。
t 和 v 這兩個節(jié)點下面講搂鲫。
2. 給每一個單元格確定數(shù)據(jù)傍药。
解析sharedStrings.xml
之前解析了那么可以看到我們需要的數(shù)據(jù)都在這里,數(shù)據(jù)是有了魂仍,那我們怎么給每一個單元格賦值呢拐辽?接下來講一下上面說到的 節(jié)點t 和 v的作用蓄诽。
v: v這個節(jié)點代表了每個col(單元格)的數(shù)據(jù)在sharedStrings.xml的下標媒吗,比如:
<c r="B1" s="1" t="s">
<v>1</v>
</c>
代表了B1這個col的數(shù)據(jù)是sharedStrings.xml 中的下標為1的數(shù)據(jù)就是'人名'
t:這個節(jié)點曾經(jīng)困惑我很久的一段時間仑氛,按照上面的流程看似一切美好闸英,實則暗藏伏擊,如果你的單元格內(nèi)是文字按照流程一切照好甫何,但是如果有數(shù)字在通過v取值就取不到。
PS:excel的每一個col會有很多格式辙喂,比如
比如下面這個節(jié)點
所以t的作用就是判斷 有沒有這個t節(jié)點巍耗,
if ([@"t" isEqualToString @"s"]){
//從sharedStrings.xml 中取
}else{
//取v 當作col內(nèi)的值
}
注:如果col內(nèi)是date格式 這個v就是從1970 到現(xiàn)在的天數(shù),如果有人需要可以留言炬太,我發(fā)我的計算公式。
現(xiàn)在所有數(shù)據(jù)都已經(jīng)處理完成了亲族,但是我們現(xiàn)在還不知道sheet1 和 sheet2 到底哪個是對應的2018.11.12-2018.11.17 可缚、2018.11.20-2018.11.25斋枢。
3.sheet 與 xml 的對應關系
(1).workbook.xml.rels
最后一步,獲取對應關系杏慰。
workbook.xml.rels 這個xml文件記錄了表格中每個sheet 與每個xml的對應關系,說白了就是一個表格中的sheet1 和 sheet2 這兩個不一樣的sheet 分別有不同的xml文件轰胁,這就需要一個標示讓我們?nèi)フ业绞窃鯓訉模奖憬馕觥?/p>
上圖是workbook.xml.rels的內(nèi)容可以看到
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet2.xml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
這兩句中的Id 對應關系的關鍵 赃阀。
上圖是當前解析的excel
(2).workbook.xml
上面弄明白了workbook.xml.rels擎颖,接下來看workbook.xml這個xml文件。
我們可以看到這個代碼
<sheets>
<sheet name="2018.11.12-2018.11.17" sheetId="1" r:id="rId1"/>
<sheet name="2018.11.20-2018.11.25" sheetId="2" r:id="rId2"/>
</sheets>
這個r:id 就是對應關系的重要部分
我介紹的有點繁瑣了驮俗,就是怕我講的不夠詳細允跑,簡單總結下:
通過workbook.xml.rels中的Id="rId2" 與 workbook.xml中的r:id="rId2" 我們可以知道 這個sheet2的sheet名叫2018.11.20-2018.11.25
4.每個單元格的樣式
styles.xml
theme1.xml
2019.4.2更新
今天用到了單元格的樣式王凑,這里介紹一下
每一個col 都有一個s節(jié)點聋丝,通過這個s索引的值 取cellXfs
cellXfs 中包含了 各種id fillId borderId 這里以fillId為例,
通過fillId這個索引的值 取fills
fills數(shù)組的元素就是當前col的填充色百姓,borderId等都同理
5.最后
解析excel看似繁瑣,實則就是考驗對xml的解析垒拢,一切都是有規(guī)律火惊,有問題請留言子库,我盡量會解答問題矗晃。demo我會利用空余時間整理一份出來。