1. 程式人生 > >Java 從Excel中讀資料

Java 從Excel中讀資料

今天工作時遇到一個需求,將Excel表格中的資料匯入到資料庫中,下面我們來看怎麼實現。

我們要用POI這個技術來實現這項功能,我們需要做的準備是下載以下jar包:

接下來我們來看怎麼將Excel中的資料傳到一個集合中

注意:這裡展示的Excel格式是xlsx也就是Excel2007及以後的版本格式,而後綴為xls的由於版本過低現在用的也少

所要用到的類主要就是:

  • HSSFWorkbook   : 它被用來讀取和寫入MS-Excel檔案的xls格式。

  • XSSFWorkbook  : 它是用於MS-Excel中XLSX檔案格式

  • HSSFSheet:代表xls格式中的一個sheet工作表、

  • XSSFSheet代表xlsx格式中的一個sheet工作表

  •  XSSFRow 代表xlsx格式中的一個sheet表中的一行

  • XSSFCell 代表xlsx格式中的一列

(參考POI教程)

其中HSSFWorkbook主要用來讀寫字尾名為xls的Excel檔案,而XSSFWorkbook 則是用於讀取字尾名為xlsx的檔案。

HSSFWorkbook這個類的主要建構函式有倆個即為:

1.HSSFWorkbook()       從頭開始建立一個新的HSSFWorkbook物件時(本來沒有,新建立一個Excel檔案,一般用於從記憶體中讀出資料)。

2.HSSFWorkbook(java.io.InputStream s)

        建立使用輸入流中的新HSSFWorkbook物件時(本來已有Excel,使用已有的Excel檔案,一般用於向記憶體中寫資料)。

而XSSFWorkbook則有四個比較重要的建構函式:

1.XSSFWorkbook()  從頭開始建立一個新的XSSFworkbook物件(和HSSFWorkbook()類似)。

2.XSSFWorkbook(java.io.File file)    構造從給定檔案中的XSSFWorkbook物件。

3.XSSFWorkbook(java.io.InputStream is) 構造一個XSSFWorkbook物件,通過緩衝整個輸入流到記憶體中,然後為它開啟一個OPCPackage物件。

4.XSSFWorkbook(java.lang.String path) 構建一個給定檔案的完整路徑的XSSFWorkbook物件。

關於poi的大致介紹就到這,主要就是這幾個類的幾個方法的運用。方法的話可以查詢以下網址,裡面有詳細的解說。

接下來直接看一個Demo

這是一個從Excel表格中讀取資料的例子。

fis = new FileInputStream(ExcelFile);
            XSSFWorkbook xssfWorkbook=new XSSFWorkbook(fis);

使用這個來將Excel檔案與流建立連線,在將流用XSSFWorkbook,建立一個針對於工作簿的物件即為xssfWorkbook。

因為一個工作簿中可能會有多張表,所以要對錶(sheet)進行迴圈遍歷

for (int numSheet = 0; numSheet <=xssfWorkbook.getNumberOfSheets(); numSheet++) {

(xssfWorkbook.getNumberOfSheets();此方法是獲取到所有的sheet的總數,本案例上的所有方法均不會詳細說明,所有方法在上文連結中皆存在,也可檢視POI的說明文件)

而我們真正想要獲取的是每張表中的每一列欄位的值,所以還得遍歷每一行,再通過行獲取到每一列的值

for (int numRow = 1; numRow <= xssfSheet.getLastRowNum(); numRow++) {
                    XSSFRow xssfRow=xssfSheet.getRow(numRow);

到這一步就已經獲取到每一行了。

if(xssfRow!=null) {
                            peo=new people();
                            XSSFCell name=xssfRow.getCell(0);
                            XSSFCell sex=xssfRow.getCell(1);
                            XSSFCell age=xssfRow.getCell(2);
                            peo.setName(getValue(name));
                            peo.setSex(getValue(sex));
                            peo.setAge(Integer.parseInt(getValue(age)));
                            peoList.add(peo);
                        }
遍歷每一行中的每一列,並將其賦值給people物件,放入集合中。至此就已經完成獲取。但還要注意的是:

public String getValue(XSSFCell xssfCell){
        
        if(xssfCell.getCellType()==xssfCell.CELL_TYPE_BOOLEAN) {
            return String.valueOf(xssfCell.getBooleanCellValue());
        }else if(xssfCell.getCellType()==xssfCell.CELL_TYPE_NUMERIC) {
            return String.valueOf((int)xssfCell.getNumericCellValue());
        }else {
            return String.valueOf(xssfCell.getStringCellValue());
        }
    }

因為精確到的只是每一列,所以還得將每一列取出,而XSSFCell有多種取值方法,

1.xssfCell.getBooleanCellValue()  對布林值進行取值

2.xssfCell.getStringCellValue() 對字串進行取值

3.xssfCell.getNumericCellValue()  對數值型別取值(short int float double等)

注意的是String.valueOf((int)xssfCell.getNumericCellValue());

使用xssfCell.getNumericCellValue() 進行轉換數值時候,會自動的將整值型別轉化成float型別,

所以要(int)xssfCell.getNumericCellValue(),進行強轉以便於回覆原來數值。