java 使用POI大量匯入excel資料

來源:互聯網
上載者:User

標籤:

一、定義

  Apache POI是Apache軟體基金會的開放源碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。

二、所需jar包

 

三、簡單的一個讀取excel的demo

1、讀取檔案方法

     /**     * 讀取出filePath中的所有資料資訊     * @param filePath excel檔案的絕對路徑     *      */        public static void getDataFromExcel(String filePath)    {        //String filePath = "E:\\123.xlsx";                //判斷是否為excel類型檔案        if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx"))        {            System.out.println("檔案不是excel類型");        }                FileInputStream fis =null;        Workbook wookbook = null;                try        {            //擷取一個絕對位址的流              fis = new FileInputStream(filePath);        }        catch(Exception e)        {            e.printStackTrace();        }               try         {            //2003版本的excel,用.xls結尾            wookbook = new HSSFWorkbook(fis);//得到活頁簿                     }         catch (Exception ex)         {            //ex.printStackTrace();            try            {                //2007版本的excel,用.xlsx結尾                                wookbook = new XSSFWorkbook(fis);//得到活頁簿            } catch (IOException e)            {                // TODO Auto-generated catch block                e.printStackTrace();            }        }                //得到一個工作表        Sheet sheet = wookbook.getSheetAt(0);                //獲得表頭        Row rowHead = sheet.getRow(0);                //判斷表頭是否正確        if(rowHead.getPhysicalNumberOfCells() != 3)        {            System.out.println("表頭的數量不對!");        }                //獲得資料的總行數        int totalRowNum = sheet.getLastRowNum();                //要獲得屬性        String name = "";        int latitude = 0;               //獲得所有資料        for(int i = 1 ; i <= totalRowNum ; i++)        {            //獲得第i行對象            Row row = sheet.getRow(i);                        //獲得獲得第i行第0列的 String類型對象            Cell cell = row.getCell((short)0);            name = cell.getStringCellValue().toString();                        //獲得一個數字類型的資料            cell = row.getCell((short)1);            latitude = (int) cell.getNumericCellValue();                        System.out.println("名字:"+name+",經緯度:"+latitude);                    }    }

 

2、測試

public static void main(String[] args)     {                getDataFromExcel("E:"+ File.separator +"123.xlsx");    }

 

3、未經處理資料

4、結果

名字:A1,經緯度:1名字:A2,經緯度:2名字:A3,經緯度:3名字:A4,經緯度:4名字:A5,經緯度:5名字:A6,經緯度:6名字:A7,經緯度:7名字:A8,經緯度:8名字:A9,經緯度:9名字:A10,經緯度:10名字:A11,經緯度:11

 

四、注意事項

1、運用多態,excel主要有.xls結尾(2003版本)和. xlsx(2007版本)兩種類型結尾的檔案,分別需要用HSSFWorkbook對象對.xls檔案進行讀取,用XSSFWorkbook對象對.xlsx檔案進行讀取,直接使用他們共同的父類Workbook進行初始化對象有利於代碼的易用性。

2、通過流的方式初始化活頁簿對象(Workbook),可以通過new XSSFWorkbook(檔案絕對路徑)和new XSSFWorkbook(輸入資料流)兩種方式初始化對象,但是假如我們只是通過修改.xls檔案的尾碼名為.xlsx,這樣子當我們用new XSSFWorkbook(檔案絕對路徑)來讀取檔案的時候就會報錯,因為他本身就不是一個2007版本的excel類型的檔案,讀取會報錯;假如我們是通過流的方式的話,可以避免這種情況,我們即使你修改了檔案的尾碼名,我們依然在初始化的時候能擷取到該對象是.xls類型檔案,使用HSSFWorkbook對象進行處理,即能得出正確的結果。

 

 五、增強版

  添加了判斷表頭是否符合規範,允許表頭對象的位置不同。進行了一定的解耦合。

    /**     *          * @param cell 一個儲存格的對象     * @return 返回該儲存格相應的類型的值     */    public static Object getRightTypeCell(Cell cell){            Object object = null;        switch(cell.getCellType())        {            case Cell.CELL_TYPE_STRING :            {                object=cell.getStringCellValue();                break;            }            case Cell.CELL_TYPE_NUMERIC :            {                cell.setCellType(Cell.CELL_TYPE_NUMERIC);                object=cell.getNumericCellValue();                break;            }                            case Cell.CELL_TYPE_FORMULA :            {                cell.setCellType(Cell.CELL_TYPE_NUMERIC);                object=cell.getNumericCellValue();                break;            }                        case Cell.CELL_TYPE_BLANK :            {                cell.setCellType(Cell.CELL_TYPE_BLANK);                object=cell.getStringCellValue();                break;            }        }        return object;    }    

 

 

/**     * 讀取出filePath中的所有資料資訊     * @param filePath excel檔案的絕對路徑     *      */        public static void getDataFromExcel2(String filePath)    {        List<Map<String,Integer>> list = new ArrayList<Map<String, Integer>>();        //判斷是否為excel類型檔案        if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx"))        {            System.out.println("檔案不是excel類型");        }                FileInputStream fis =null;        Workbook wookbook = null;        int flag = 0;                try        {            //擷取一個絕對位址的流              fis = new FileInputStream(filePath);        }        catch(Exception e)        {            e.printStackTrace();        }               try         {            //2003版本的excel,用.xls結尾            wookbook = new HSSFWorkbook(fis);//得到活頁簿                     }         catch (Exception ex)         {            //ex.printStackTrace();            try            {                //2007版本的excel,用.xlsx結尾                                wookbook = new XSSFWorkbook(filePath);//得到活頁簿            } catch (IOException e)            {                // TODO Auto-generated catch block                e.printStackTrace();            }        }                //得到一個工作表        Sheet sheet = wookbook.getSheetAt(0);                //獲得表頭        Row rowHead = sheet.getRow(0);              //根據不同的data放置不同的表頭        Map<Object,Integer> headMap = new HashMap<Object, Integer>();                        //判斷表頭是否合格  ------------------------這裡看你有多少列        if(rowHead.getPhysicalNumberOfCells() != 2)        {            System.out.println("表頭列數與要匯入的資料庫不對應");        }                try        {            //----------------這雷根據你的表格有多少列            while (flag < 2)            {                Cell cell = rowHead.getCell(flag);                if (getRightTypeCell(cell).toString().equals("基站名"))                {                    headMap.put("jizhan", flag);                }                if (getRightTypeCell(cell).toString().equals("經緯度"))                {                    headMap.put("jingweidu", flag);                }                flag++;            }        } catch (Exception e)        {            e.printStackTrace();            System.out.println("表頭不合規範,請修改後重新匯入");        }                        //獲得資料的總行數        int totalRowNum = sheet.getLastRowNum();                                //要獲得屬性        String name = "";        double latitude = 0;                if(0 == totalRowNum)        {            System.out.println("Excel內沒有資料!");        }                Cell cell_1 = null,cell_2 = null;               //獲得所有資料        for(int i = 1 ; i <= totalRowNum ; i++)        {            //獲得第i行對象            Row row = sheet.getRow(i);                        try            {                cell_1 = row.getCell(headMap.get("jizhan"));                cell_2 = row.getCell(headMap.get("jingweidu"));            } catch (Exception e)            {                e.printStackTrace();                System.out.println("擷取儲存格錯誤");            }                        try            {                //基站                name = (String) getRightTypeCell(cell_1);                //經緯度                latitude = (Double) getRightTypeCell(cell_2);            } catch (ClassCastException e)            {                e.printStackTrace();                System.out.println("資料不全是數字或全部是文字!");            }            System.out.println("名字:"+name+",經緯度:"+latitude);                    }    }    

 

java 使用POI大量匯入excel資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.