Java讀寫Excel的包是Apache POI。
JAVA EXCEL API:是一開放源碼項目,通過它Java開發人員可以讀取Excel文件的內容、創建新的Excel文件、更新已經存在的Excel文件。使用該API非Windows操作系統也可以通過純Java應用來處理Excel數據表。因爲它是使用Java編寫的,所以我們在Web應用中可以通過JSP、Servlet來調用API實現對Excel數據表的訪問。下面是一個全部代碼後面是分步解析
package com.myFirstSpring.test;
import org.apache.poi.ss.usermodel.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.sun.org.apache.bcel.internal.generic.RET;
import java.io.File;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author tqf
* @version 創建時間:2020-4-7 下午4:10:18
* 類說明:讀取excel文件內容
*/
public class ReadExcel {
public static void main(String[] args) {
readExcel("D:\\測試生成Excel文件\\withoutHead2.xls");
//readExcel2();
}
public static void readExcel(String path) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
File file = new File(path);
FileInputStream fis = null;
Workbook workBook = null;
if (file.exists()) {
try {
fis = new FileInputStream(file);
workBook = WorkbookFactory.create(fis);
int numberOfSheets = workBook.getNumberOfSheets(); //獲取有幾個sheet
List<read_excel>list = new ArrayList<>();
// sheet工作表
for (int s = 0; s <numberOfSheets ; s++) { //numberOfSheets
Sheet sheetAt = workBook.getSheetAt(s);
//獲取工作表名稱
String sheetName = sheetAt.getSheetName();
System.out.println("工作表名稱:" + sheetName);
// 獲取當前Sheet的總行數
int rowsOfSheet = sheetAt.getPhysicalNumberOfRows();
System.out.println("當前表格的總行數:" + rowsOfSheet);
// 第一行
Row row0 = sheetAt.getRow(0);
int physicalNumberOfCells = sheetAt.getRow(0).getPhysicalNumberOfCells();
String[] title = new String[physicalNumberOfCells];
for (int i = 0; i < physicalNumberOfCells; i++) {
title[i] = row0.getCell(i).getStringCellValue();
System.out.print(title[i] + " ");
}
System.out.println();
for (int r = 1; r < rowsOfSheet; r++) {
Row row = sheetAt.getRow(r);//獲取的第幾行數據
int cellCount = row.getPhysicalNumberOfCells(); //獲取總列數
//遍歷每一列
read_excel excel = new read_excel();
for (int c = 0; c < cellCount; c++) {
Cell cell = row.getCell(c);
int cellType = cell.getCellType();
String cellValue = null;
switch(cellType) {
case Cell.CELL_TYPE_STRING: //文本
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC: //數字、日期
if(DateUtil.isCellDateFormatted(cell)) {
cellValue = sdf.format(cell.getDateCellValue()); //日期型
}
else {
cellValue = String.valueOf(cell.getNumericCellValue()); //數字
}
break;
case Cell.CELL_TYPE_BOOLEAN: //布爾型
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_BLANK: //空白
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_ERROR: //錯誤
cellValue = "錯誤";
break;
case Cell.CELL_TYPE_FORMULA: //公式
cellValue = "錯誤";
break;
default:
cellValue = "錯誤";
}
if(cellValue == "" || "錯誤".equals(cellValue)){
System.out.println("第" + r + "行,第"+c+"列[" + title[c] + "]數據錯誤!");
return;
}
//下面是被獲取到的數據存放在用戶實體類 read_excel
switch (c) {
case 0:
excel.setId(cellValue);
break;
case 1:
excel.setName(cellValue);
break;
case 2:
excel.setAge(Integer.parseInt(cellValue));
break;
case 3:
excel.setTime(cellValue);
break;
default:
break;
}
System.out.print(cellValue + " ");
}
list.add(excel); //獲取的數據存放在list 最後進行添加到數據庫操作
System.out.println();
}
System.out.println();
}
if (fis != null) {
fis.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("文件不存在!");
}
}
/**
* 讀取Excel測試,兼容 Excel 2003/2007/2010
*/
public static void readExcel2()
{
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
try {
//同時支持Excel 2003、2007
File excelFile = new File("D:\\測試生成Excel文件\\withoutHead2.xls"); //創建文件對象
FileInputStream is = new FileInputStream(excelFile); //文件流
Workbook workbook = WorkbookFactory.create(is); //這種方式 Excel 2003/2007/2010 都是可以處理的
int sheetCount = workbook.getNumberOfSheets(); //Sheet的數量
//遍歷每個Sheet
for (int s = 0; s < sheetCount; s++) {
Sheet sheet = workbook.getSheetAt(s);
int rowCount = sheet.getPhysicalNumberOfRows(); //獲取總行數
//遍歷每一行
for (int r = 0; r < rowCount; r++) {
Row row = sheet.getRow(r);
int cellCount = row.getPhysicalNumberOfCells(); //獲取總列數
//遍歷每一個單元格
for (int c = 0; c < cellCount; c++) {
Cell cell = row.getCell(c);
int cellType = cell.getCellType();
String cellValue = null;
//在讀取單元格內容前,設置所有單元格中內容都是字符串類型
cell.setCellType(Cell.CELL_TYPE_STRING);
//按照字符串類型讀取單元格內數據
cellValue = cell.getStringCellValue();
/*在這裏可以對每個單元格中的值進行二次操作轉化*/
System.out.print(cellValue + " ");
}
System.out.println();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public void stop(){
for (int i = 0;i<10;i++){
for (int j = 0; j<10; j++)
{
System.out.println(j);
if (i<10){
System.out.println("retuen 跳出循環");
return;
}
}
}
}
}
1 、創建Workbook對象
//path是你要讀取的excel文件路徑 或者上傳的excel文件
File file = new File(path);
FileInputStream fis = null;
Workbook workBook = null;
fis = new FileInputStream(file);
workBook = WorkbookFactory.create(fis);
2 、獲取第一張表
int numberOfSheets = workBook.getNumberOfSheets(); //獲取有幾個sheet 遍歷
for (int s = 0; s <numberOfSheets ; s++) { //numberOfSheets
Sheet sheetAt = workBook.getSheetAt(s);
}
3 、獲取sheet表中的總行數
//獲取工作表名稱
String sheetName = sheetAt.getSheetName();
ystem.out.println("工作表名稱:" + sheetName);
// 獲取當前Sheet的總行數
int rowsOfSheet = sheetAt.getPhysicalNumberOfRows();
System.out.println("當前表格的總行數:" + rowsOfSheet);
4 、獲取sheet表中的總列數
for (int r = 1; r < rowsOfSheet; r++) {
Row row = sheetAt.getRow(r);//獲取的第幾行數據
int cellCount = row.getPhysicalNumberOfCells(); //獲取總列數
}
異常描述:在導入excel的時候在獲取excel單元格數據的時候會出現Cannot get a text value from a numeric cell的異常拋出。
異常原因:poi讀取excel單元格的數據,cell有不同的數據類型(CELL_TYPE_NUMERIC,CELL_TYPE_STRING,CELL_TYPE_FORMULA),如果cell中的數據是數值的話,如果你沒有給他設置cell的類型的話。默認會認爲是CELL_TYPE_NUMERICl類型,如果從一個NUMBER類型的Cell使用.cell.getStringCellValue()讀取出一個字符串就會出錯。
解決的方法:在讀取數據之前,設置cell的類型爲CELL_TYPE_STRING; cell.setCellType(Cell.CELL_TYPE_STRING);
好了以上寫的關於讀取excel文件內容插入到數據庫的方法,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果對你有用 點贊評論收藏 加關注^_^