美文网首页
mac os 解析excel

mac os 解析excel

作者: Breezes | 来源:发表于2019-03-25 14:47 被阅读0次

    使用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

    image.png
    cellXfs 中包含了 各种id fillId borderId 这里以fillId为例,
    通过fillId这个索引的值 取fills
    image.png
    fills数组的元素就是当前col的填充色,borderId等都同理

    5.最后

    解析excel看似繁琐,实则就是考验对xml的解析,一切都是有规律,有问题请留言,我尽量会解答问题。demo我会利用空余时间整理一份出来。

    相关文章

      网友评论

          本文标题:mac os 解析excel

          本文链接:https://www.haomeiwen.com/subject/dqmvvqtx.html