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)
而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型別,