使用SSZipArchive解压excel文件获得一个文件,SSZipArchive解压的时候会指定一个路径,解压完成的文件通过路径获得,文件夹的目录是这样的
9E7A5294-9AC9-4C70-8C13-97EA24F9E4B6.png
当前解析的表格如下:
image.png
这里只需要关注xl这个文件夹,接下来解释下每个文件夹对应的每个xml的作用。
-----------------------------------------分割线---------------------------------------------
1.解析sheet
image.png上图中这两个sheet1和sheet2分别代表了excel中的2018.11.12-2018.11.17 和 2018.11.12-2018.11.17 。 需要我们解析拿到数据。
image.png
<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 这两个节点下面讲。
2. 给每一个单元格确定数据。
解析sharedStrings.xml
image.png
之前解析了那么可以看到我们需要的数据都在这里,数据是有了,那我们怎么给每一个单元格赋值呢?接下来讲一下上面说到的 节点t 和 v的作用。
v: v这个节点代表了每个col(单元格)的数据在sharedStrings.xml的下标,比如:
<c r="B1" s="1" t="s">
<v>1</v>
</c>
代表了B1这个col的数据是sharedStrings.xml 中的下标为1的数据就是'人名'
t:这个节点曾经困惑我很久的一段时间,按照上面的流程看似一切美好,实则暗藏伏击,如果你的单元格内是文字按照流程一切照好,但是如果有数字在通过v取值就取不到。
PS:excel的每一个col会有很多格式,比如
image.png
比如下面这个节点
image.png
所以t的作用就是判断 有没有这个t节点,
if ([@"t" isEqualToString @"s"]){
//从sharedStrings.xml 中取
}else{
//取v 当作col内的值
}
注:如果col内是date格式 这个v就是从1970 到现在的天数,如果有人需要可以留言,我发我的计算公式。
现在所有数据都已经处理完成了,但是我们现在还不知道sheet1 和 sheet2 到底哪个是对应的2018.11.12-2018.11.17 、2018.11.20-2018.11.25。
3.sheet 与 xml 的对应关系
(1).workbook.xml.rels
最后一步,获取对应关系。
image.png
workbook.xml.rels 这个xml文件记录了表格中每个sheet 与每个xml的对应关系,说白了就是一个表格中的sheet1 和 sheet2 这两个不一样的sheet 分别有不同的xml文件,这就需要一个标示让我们去找到是怎样对应的,方便解析。
image.png
上图是workbook.xml.rels的内容可以看到
<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 对应关系的关键 。
image.png
上图是当前解析的excel
(2).workbook.xml
上面弄明白了workbook.xml.rels,接下来看workbook.xml这个xml文件。
image.png
我们可以看到这个代码
<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节点,通过这个s索引的值 取cellXfs
cellXfs 中包含了 各种id fillId borderId 这里以fillId为例,
通过fillId这个索引的值 取fills
image.png
fills数组的元素就是当前col的填充色,borderId等都同理
5.最后
解析excel看似繁琐,实则就是考验对xml的解析,一切都是有规律,有问题请留言,我尽量会解答问题。demo我会利用空余时间整理一份出来。
网友评论