Android读取Excel2007

基于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去看每一步的输出才是王道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
android 使用poi读取高版本excel, 解决以下这两个错误 java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/xml/stream/XMLEventFactory; at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.(PackagePropertiesMarshaller.java:41) at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161) at org.apache.poi.openxml4j.opc.OPCPackage.(OPCPackage.java:141) at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:97) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:184) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:149) javax.xml.stream.FactoryConfigurationError: Provider com.sun.xml.internal.stream.events.XMLEventFactoryImpl not found at javax.xml.stream.FactoryFinder.newInstance(Unknown Source) at javax.xml.stream.FactoryFinder.newInstance(Unknown Source) at javax.xml.stream.FactoryFinder.find(Unknown Source) at javax.xml.stream.FactoryFinder.find(Unknown Source) at javax.xml.stream.XMLEventFactory.newInstance(Unknown Source) at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.(PackagePropertiesMarshaller.java:41) at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161) at org.apache.poi.openxml4j.opc.OPCPackage.(OPCPackage.java:141) at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:97) at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:184) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:149)
Android读取Excel有多种方法,以下是其两种常用的方法: 1. 使用 Apache POI 库: 首先,将 Apache POI 库添加到您的 Android 项目。然后,按照以下步骤读取 Excel 文件: a. 创建一个 InputStream 对象,用于打开 Excel 文件: ```java InputStream inputStream = new FileInputStream(filePath); ``` b. 创建一个 Workbook 对象,并根据文件类型进行实例化: ```java Workbook workbook = WorkbookFactory.create(inputStream); ``` c. 获取要读取的工作表对象: ```java Sheet sheet = workbook.getSheetAt(sheetIndex); ``` d. 遍历工作表的行和列,并读取单元格内容: ```java for (Row row : sheet) { for (Cell cell : row) { String cellValue = cell.getStringCellValue(); // 处理单元格内容 } } ``` e. 关闭 Workbook 和 InputStream: ```java workbook.close(); inputStream.close(); ``` 2. 使用 JExcelApi 库: 首先,将 JExcelApi 库添加到您的 Android 项目。然后,按照以下步骤读取 Excel 文件: a. 创建一个 Workbook 对象并打开 Excel 文件: ```java Workbook workbook = Workbook.getWorkbook(new File(filePath)); ``` b. 获取要读取的工作表对象: ```java Sheet sheet = workbook.getSheet(sheetIndex); ``` c. 遍历工作表的行和列,并读取单元格内容: ```java for (int row = 0; row < sheet.getRows(); row++) { for (int col = 0; col < sheet.getColumns(); col++) { Cell cell = sheet.getCell(col, row); String cellValue = cell.getContents(); // 处理单元格内容 } } ``` d. 关闭 Workbook: ```java workbook.close(); ``` 以上是两种常用的方法,您可以根据自己的需求选择适合的方法来读取 Excel 文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值