最近做項目需要讀取excel,在網上找了幾個,都需要下載各種jar,下載好之后還是不能用,而且還分(xls xlsx)這兩種格式, 最后找到個這個,不需要下載jar包,格式通吃,不過只是簡單的讀取,可根據自己需要修改代碼。

package com.shxr.utils; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Element; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import com.leimingtech.core.entity.base.Member; public class XlsUtils{ /** * @param args */ public static void main(String[] args) { } public static void getDate(){ // 解壓Book1.xlsx ZipFile xlsxFile; try { xlsxFile = new ZipFile(new File("e:\\gongyingshang.xlsx")); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 先讀取sharedStrings.xml這個文件備用 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(); } // 找到解壓文件夾里的workbook.xml,此文件中包含了這張工作表中有幾個sheet ZipEntry workbookXML = xlsxFile.getEntry("xl/workbook.xml"); InputStream workbookXMLIS = xlsxFile.getInputStream(workbookXML); Document doc = dbf.newDocumentBuilder().parse(workbookXMLIS); // 獲取一共有幾個sheet NodeList nl = doc.getElementsByTagName("sheet"); for (int i = 0; i < nl.getLength(); i++) { Element element = (Element) nl.item(i);// 將node轉化為element,用來得到每個節點的屬性 System.out.println(element.getAttribute("name"));// 輸出sheet節點的name屬性的值 // 接着就要到解壓文件夾里找到對應的name值的xml文件,比如在workbook.xml中有<sheet name="Sheet1" // sheetId="1" r:id="rId1" /> 節點 // 那么就可以在解壓文件夾里的xl/worksheets下找到sheet1.xml,這個xml文件夾里就是包含的表格的內容 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++) { // 得到每個行 // 行的格式: /* * <row r="1" spans="1:3">r表示第一行,spans表示有幾列 <c r="A1" * t="s">//r表示該列的列表 * ,t="s"個人認為是表示這個單元格的內容可以在sharedStrings.xml這個文件里找到,對應的節點 * 下標就是v節點的值,即0,若沒有t屬性,則v的值就是該單元格的內容 <v>0</v> </c> <c r="B1" * t="s"> <v>1</v> </c> <c r="C1" t="s"> <v>2</v> </c> </row> */ Element row = (Element) rowdata.item(j); // 根據行得到每個行中的列 NodeList columndata = row.getElementsByTagName("c"); for (int k = 0; k < 1; 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")) { // 如果是共享字符串則在sharedstring.xml里查找該列的值 String mobile=sharedStrings[Integer.parseInt(value.getTextContent())]; // System.out.print(sharedStrings[Integer.parseInt(value.getTextContent())] + " "); } else { if (value != null) { member.setMemberMobile(value.getTextContent()); System.out.print(value.getTextContent() + " "); }else { ystem.out.println("j : " + j + " k : " + k + " null"); System.out.println("空"); } } } System.out.println(); } } } catch (ZipException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }