java解析動態Excel

核心

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章