天天看點

官方給的 JXLS 讀取 excel 檔案的例子

官方給的 JXLS 讀取 excel 檔案的例子

​​本文示例代碼下載下傳位址

​​        jXLS 提供 jxls-reader 子產品用來讀取 XLS 檔案并且用讀來的表格資料填充 Java bean。

        使用 jXLS 來解析 cxcel 檔案并使用讀來的資料填充 Java 對象我們首先要建立一個 XLSReader 對象。要建立這個對象,最簡單的方法就是使用一個 XML 配置檔案。在本文的示例代碼中,我們使用具有部門資訊資料的 departmentdata.xls 檔案來展示這一方法。

        我們使用 XML 檔案在電子表單元格和 Java 對象之間進行映射。映射檔案的結構比較簡單。以示例代碼中 departmentdata.xls 檔案的 Sheet1 為例,我們看一下 XML 檔案是如何進行映射的:

<?xml version="1.0" encoding="ISO-8859-1"?>
                    <workbook>
                        <worksheet name="Sheet1">
                            <section startRow="0" endRow="6">
                                <mapping cell="B1">department.name</mapping>
                                <mapping cell="A4">department.chief.name</mapping>
                                <mapping cell="B4">department.chief.age</mapping>
                                <mapping cell="D4">department.chief.payment</mapping>
                                <mapping row="3" col="4">department.chief.bonus</mapping>
                            </section>
                            <loop startRow="7" endRow="7" items="department.staff" var="employee" varType="net.sf.jxls.reader.sample.Employee">
                                <section startRow="7" endRow="7">
                                    <mapping row="7" col="0">employee.name</mapping>
                                    <mapping row="7" col="1">employee.age</mapping>
                                    <mapping row="7" col="3">employee.payment</mapping>
                                    <mapping row="7" col="4">employee.bonus</mapping>
                                </section>
                                <loopbreakcondition>
                                    <rowcheck offset="0">
                                        <cellcheck offset="0">Employee Payment Totals:</cellcheck>
                                    </rowcheck>
                                </loopbreakcondition>
                            </loop>
                        </worksheet>
                    </workbook>      

        可以看到,XML 檔案的根元素是 workbook,workbook 可以包含子元素 worksheet。worksheet 标簽應該使用 name 屬性來指出它所描述的 excel 表格(在我們的例子中是 Sheet1)。

        worksheet 元素可以包含任意數量的 section 和 loop 子元素。

        section 元素代表了一個簡單的電子表格單元格塊。這個單元格塊的首行和最後一行使用 startRow 和 endRow 屬性來定義。

        在 jXLS 目前版本中,我們就是通過定義一系列的 section 來解析整個的 excel sheet 檔案。這意味着即使我們不打算讀取 sheet 的起始行,我們也要定義一個空的 section,這樣,這些行才會在我們的 XML 檔案中被反映出來。這些沒用的行将被忽略掉。

        使用 mapping 标簽将 XLS 檔案的單元格映射到 Java bean 的屬性中:

<mapping cell="B1">department.name</mapping>      

        另外一個做法是使用單元格的行号和列号(基于 0,即起始 為 0)來定義要映射的單元格:

<mapping row="3" col="4">department.chief.bonus</mapping>      

        以上定義了 E4 單元格,并把它映射到 department.chief.bonus 屬性。

        loop 元素用來定義一些循環(重複)的行,它應該包含 startRow 和 endRow 屬性來定義這些重複塊的開始行和結束行。類似于 JSTL 标簽,items 屬性代表了包含這些重複行的容器,var 屬性用來訓示周遊時的容器的某一項,varType 屬性定義了 var 屬性所代表的 Java 類全名:

<loop startRow="7" endRow="7" items="department.staff" var="employee" varType="net.sf.jxls.reader.sample.Employee">      

        loop 元素可以包含任意數量的 section 和 loop 元素。loop 元素必須包含 loopbreakcondition 來定義循環的跳出終止。在我們的示例中以 loop 塊的下一行的第一個單元格的 Employee Payment Totals: 作為跳出判斷:

<loopbreakcondition>
                        <rowcheck offset="0">
                            <cellcheck offset="0">Employee Payment Totals:</cellcheck>
                        </rowcheck>
                    </loopbreakcondition>      

        以上就是我們在建立 XML 映射檔案時所有要注意的事項。下邊是一個簡單的提取 XLS 檔案資料到 Java bean 的示例代碼:

InputStream inputXML = new BufferedInputStream(getClass().getResourceAsStream(xmlConfig));
                    XLSReader mainReader = ReaderBuilder.buildFromXML( inputXML );
                    InputStream inputXLS = new BufferedInputStream(getClass().getResourceAsStream(dataXLS));
                    Department department = new Department();
                    Department hrDepartment = new Department();
                    List departments = new ArrayList();
                    Map beans = new HashMap();
                    beans.put("department", department);
                    beans.put("hrDepartment", hrDepartment);
                    beans.put("departments", departments);
                    XLSReadStatus readStatus = mainReader.read( inputXLS, beans);