標籤:
參考連結:
程式碼:
package demo;import java.io.File;import java.io.IOException;import java.io.InputStream;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;public class demo { /** * @param args */ public static void main(String[] args) { // 解壓Book1.xlsx ZipFile xlsxFile; try { xlsxFile = new ZipFile(new File("c:\\text1.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 < 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")) { // 如果是共用字串則在sharedstring.xml裡尋找該列的值 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 (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(); } }}View Code
通過純Java代碼從excle中讀取資料(為.xlsx檔案)