基于apache大神的POI。
这个框架很重的赶脚,毕竟不是为Android设计的,直接下了apache的包发现各种报错和JVM内存溢出,无奈遍寻网络找到了一个可以使用的例子,代码很绕,研究了半天才看明白。这里贴出来mark一下下。
先上代码:
ZipFile xlsxFile;
try
{
xlsxFile = new ZipFile(getFilePath());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
ZipEntry sharedStringXML = xlsxFile
.getEntry("xl/sharedStrings.xml");
InputStream sharedStringXMLIS = xlsxFile
.getInputStream(sharedStringXML);
Document sharedString;
sharedString = dbf.newDocumentBuilder().parse(sharedStringXMLIS);
NodeList str = sharedString.getElementsByTagName("t");
String sharedStrings[] = new String[str.getLength()];
for (int n = 0; n < str.getLength(); n++)
{
Element element = (Element) str.item(n);
sharedStrings[n] = element.getTextContent();
}
ZipEntry workbookXML = xlsxFile.getEntry("xl/workbook.xml");
InputStream workbookXMLIS = xlsxFile.getInputStream(workbookXML);
Document doc = dbf.newDocumentBuilder().parse(workbookXMLIS);
NodeList nl = doc.getElementsByTagName("sheet");
for (int i = 0; i < nl.getLength(); i++)
{
Element element = (Element) nl.item(i);
System.out.println(element.getAttribute("name"));
ZipEntry sheetXML = xlsxFile.getEntry("xl/worksheets/"
+ element.getAttribute("name").toLowerCase() + ".xml");
InputStream sheetXMLIS = xlsxFile.getInputStream(sheetXML);
Document sheetdoc = dbf.newDocumentBuilder().parse(sheetXMLIS);
NodeList rowdata = sheetdoc.getElementsByTagName("row");
for (int j = 0; j < rowdata.getLength(); j++)
{
Element row = (Element) rowdata.item(j);
NodeList columndata = row.getElementsByTagName("c");
for (int k = 0; k < columndata.getLength(); k++)
{
Element column = (Element) columndata.item(k);
NodeList values = column.getElementsByTagName("v");
Element value = (Element) values.item(0);
if (column.getAttribute("t") != null
& column.getAttribute("t").equals("s"))
{
System.out.print(sharedStrings[Integer
.parseInt(value.getTextContent())] + " ");
}
else
{
if (value != null)
{
System.out.print(value.getTextContent() + " ");
}
else
{
System.out.println("j : " + j + " k : " + k
+ " null");
}
}
}
System.out.println();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
这个代码直接看理解起来会蛋碎,如果把对应的xml打印出来一看就明白了,首先第一个for循环是把excel里所有的字符(非数字)类型取出来,对应id放进一个String数组里,组织这个字符的xml大概长下面这样:
<sst>
<si>
<t></t>
</si>
<si>
<t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
<si><t></t>
<phonet
icPr></phoneticPr>
</si>
<si><t></t>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
<si><t></t>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
<si><t></t>
<phoneticPr></phoneticPr>
</si>
</sst>
对应代码看就看明白了,t标签里就是我们要的string
再看第二个for循环,也是个大坑啊,看了半天才看懂,看xml:
<worksheet><sheetPr></sheetPr>
<dimension></dimension>
<sheetViews><sheetView><selection></selection>
</sheetView>
</sheetViews>
<sheetFormatPr></sheetFormatPr>
<cols><col></col>
</cols>
<sheetData><row><c>true<v>14</c>
<c>true<v>0</c>
<c>true<v>46</c>
<c>true<v>18</c>
<c>true<v>19</c>
</row>
<row><c>true<v>15</c>
<c>true<v>7</c>
<c>false<v>1</c>
<c>false<v>45.59</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>28</c>
<c>false<v>103</c>
<c>false<v>39.840000000000003</c>
<c>true<v>24</c>
</row>
<row><c>true<v>15</c>
<c>true<v>8</c>
<c>false<v>1</c>
<c>false<v>50.81</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>8</c>
<c>false<v>2</c>
<c>false<v>42.43</c>
<c>true<v>21</c>
</row>
<row><c>true<v>45</c>
<c>true<v>37</c>
<c>false<v>5</c>
<c>false<v>30.7</c>
<c>true<v>21</c>
</row>
<row><c>true<v>45</c>
<c>true<v>34</c>
<c>false<v>1</c>
<c>false<v>33.33</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>36</c>
<c>false<v>2</c>
<c>false<v>30.71</c>
<c>true<v>25</c>
</row>
<row><c>true<v>15</c>
<c>true<v>11</c>
<c>false<v>4</c>
<c>false<v>33.270000000000003</c>
<c>true<v>23</c>
</row>
<row><c>true<v>45</c>
<c>true<v>39</c>
<c>false<v>1</c>
<c>false<v>27.25</c>
<c>true<v>25</c>
</row>
<row><c>true<v>15</c>
<c>true<v>10</c>
<c>false<v>1</c>
<c>false<v>36.46</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>41</c>
<c>false<v>3</c>
<c>false<v>21.22</c>
<c>true<v>24</c>
</row>
<row><c>true<v>45</c>
<c>true<v>44</c>
<c>false<v>1</c>
<c>false<v>0</c>
<c>true<v>23</c>
</row>
<row><c>true<v>15</c>
<c>true<v>9</c>
<c>false<v>1</c>
<c>false<v>32.74</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>9</c>
<c>false<v>2</c>
<c>false<v>35.74</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>27</c>
<c>false<v>2</c>
<c>false<v>41.6</c>
<c>true<v>23</c>
</row>
<row><c>true<v>45</c>
<c>true<v>42</c>
<c>false<v>3</c>
<c>false<v>0</c>
<c>true<v>21</c>
</row>
<row><c>true<v>15</c>
<c>true<v>6</c>
<c>false<v>2</c>
<c>false<v>32.01</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>6</c>
<c>false<v>4</c>
<c>false<v>31.34</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>33</c>
<c>false<v>1</c>
<c>false<v>33.6</c>
<c>true<v>25</c>
</row>
<row><c>true<v>15</c>
<c>true<v>17</c>
<c>false<v>1</c>
<c>false<v>0</c>
<c>true<v>25</c>
</row>
<row><c>true<v>15</c>
<c>true<v>5</c>
<c>false<v>2</c>
<c>false<v>36.26</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>38</c>
<c>false<v>7</c>
<c>false<v>30.34</c>
<c>true<v>21</c>
</row>
<row><c>true<v>45</c>
<c>true<v>26</c>
<c>false<v>1</c>
<c>false<v>42.94</c>
<c>true<v>25</c>
</row>
<row><c>true<v>15</c>
<c>true<v>1</c>
<c>false<v>13</c>
<c>false<v>33.07</c>
<c>true<v>21</c>
</row>
<row><c>true<v>15</c>
<c>true<v>4</c>
<c>false<v>4</c>
<c>false<v>43.62</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>4</c>
<c>false<v>29</c>
<c>false<v>32.96</c>
<c>true<v>22</c>
</row>
<row><c>true<v>15</c>
<c>true<v>13</c>
<c>false<v>2</c>
<c>false<v>32.39</c>
<c>true<v>21</c>
</row>
<row><c>true<v>45</c>
<c>true<v>13</c>
<c>false<v>1</c>
<c>false<v>36.89</c>
<c>true<v>25</c>
</row>
<row><c>true<v>15</c>
<c>true<v>12</c>
<c>false<v>1</c>
<c>false<v>20.81</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>31</c>
<c>false<v>3</c>
<c>false<v>35.979999999999997</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>29</c>
<c>false<v>1</c>
<c>false<v>38.869999999999997</c>
<c>true<v>25</c>
</row>
<row><c>true<v>15</c>
<c>true<v>3</c>
<c>false<v>16</c>
<c>false<v>28.53</c>
<c>true<v>21</c>
</row>
<row><c>true<v>45</c>
<c>true<v>3</c>
<c>false<v>2</c>
<c>false<v>30.69</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>40</c>
<c>false<v>17</c>
<c>false<v>24.89</c>
<c>true<v>20</c>
</row>
<row><c>true<v>45</c>
<c>true<v>43</c>
<c>false<v>1</c>
<c>false<v>0</c>
<c>true<v>25</c>
</row>
<row><c>true<v>45</c>
<c>true<v>30</c>
<c>false<v>3</c>
<c>false<v>36.479999999999997</c>
<c>true<v>21</c>
</row>
<row><c>true<v>45</c>
<c>true<v>32</c>
<c>false<v>20</c>
<c>false<v>35.74</c>
<c>true<v>22</c>
</row>
<row><c>true<v>45</c>
<c>true<v>35</c>
<c>false<v>4</c>
<c>false<v>33.15</c>
<c>true<v>21</c>
</row>
<row><c>true<v>15</c>
<c>true<v>2</c>
<c>false<v>9</c>
<c>false<v>42.59</c>
<c>true<v>24</c>
</row>
<row><c>true<v>15</c>
<c>true<v>16</c>
<c>false<v>3</c>
<c>false<v>0</c>
<c>true<v>23</c>
</row>
</sheetData>
<sortState><sortCondition></sortCondition>
</sortState>
<phoneticPr></phoneticPr>
<pageMargins></pageMargins>
<pageSetup></pageSetup>
</worksheet>
这个excel里面的第三列和第四列是数字,第一第二第五列是string,大家可以看到string在这个xml里全是数字来表示的,而这个数字就是第一个for循环搞出来的数组里对应的id。这下原理大家明白了吧。
有时候觉得注释写了还不如不写,越看越糊涂,debug去看每一步的输出才是王道。