核心
1、判斷當前Excel類型,xls或xlsx,然後讀取內容
public static Workbook readExcel(String filePath){
Workbook wb = null;
if(filePath==null){
return null;
}
String extString = filePath.substring(filePath.lastIndexOf("."));
InputStream is = null;
try {
is = new FileInputStream(filePath);
if(".xls".equals(extString)){
return wb = new HSSFWorkbook(is);
}else if(".xlsx".equals(extString)){
return wb = new XSSFWorkbook(is);
}else{
return wb = null;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return wb;
}
2、獲取當前Excel中sheet頁,獲取當前sheet頁的行數,獲取當前行的列數
wb.getNumberOfSheets()可獲得Excel總sheet頁
sheet.getPhysicalNumberOfRows() 獲取當前sheet頁行數
row.getPhysicalNumberOfCells() 獲取當前行列數
3、建立二維數組,遍歷Excel保存數據到二維數組。
通過步驟2中的方法計算出行和列之後,可以新建一個二維數組,用於保存當前sheet頁的行和列數據。如果sheet頁是動態,那麼可以考慮使用三維數組,但三維數組可能一部分人糾結在sheet頁下標放在x還是z,個人覺的x,行和列可以往後移動。
使用 二維數組可以這麼初始化
String columns[][] = new String[rownum][colnum];
for (int i = 1; i < rownum; i++) {
row = sheet.getRow(i);
if(row !=null){
for (int j = 0;j < colnum;j++){
try {
cellData = (String) getCellFormatValue(row.getCell(j));
columns[i][j] = cellData;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
如使用三維數組可直接初始化三維數組
String columns[][][] = new String[wb.getNumberOfSheets()][rownum][colnum];
sheet頁我們已經做了處理,所以可以直接用獲取sheet的方法遍歷即可,以下一致。
注意單元格類型判斷和內容獲取時的重複和順序以及異常處理情況
public static Object getCellFormatValue(Cell cell) throws Exception{
Object cellValue = null;
if(cell!=null){
//判斷cell類型
switch(cell.getCellType()){
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
cellValue = sdf.format(cell.getDateCellValue());// 日期
} catch (Exception e) {
throw new Exception("exception on get date data !".concat(e.toString()));
}finally{
sdf = null;
}
} else {
BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
cellValue = bd.toPlainString();// 數值 這種用BigDecimal包裝再獲取plainString,可以防止獲取到科學計數值
}
case Cell.CELL_TYPE_FORMULA:
//判斷cell是否爲日期格式
if(DateUtil.isCellDateFormatted(cell)){
//轉換爲日期格式YYYY-mm-dd
cellValue = cell.getDateCellValue();
}else{
//數字
cellValue = String.valueOf(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_STRING:
cellValue = cell.getRichStringCellValue().getString();
break;
case Cell.CELL_TYPE_BLANK:
cellValue = "";
break;
case Cell.CELL_TYPE_BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
case Cell.CELL_TYPE_ERROR: // 故障
cellValue = "ERROR";
default:
cellValue = "N/A";
}
}else{
cellValue = "";
}
return cellValue;
}
main方法:
for (int n = 0; n <wb.getNumberOfSheets(); n++) {
//獲取第一個sheet
sheet = wb.getSheetAt(n);
//獲取最大行數
int rownum = sheet.getPhysicalNumberOfRows();
if(rownum > 0) {
//獲取第一行
row = sheet.getRow(0);
//獲取最大列數
int colnum = row.getPhysicalNumberOfCells();
String columns[][] = new String[rownum][colnum];
for (int i = 1; i < rownum; i++) {
row = sheet.getRow(i);
if(row !=null){
for (int j = 0;j < colnum;j++){
try {
cellData = (String) getCellFormatValue(row.getCell(j));
columns[i][j] = cellData;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
list.add(columns);
}
}
導入的poi使用的jar包
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;