1. 程式人生 > 其它 >個人技術部落格——使用POI操作excel

個人技術部落格——使用POI操作excel

目錄

技術概述。

Apache POI是Apache軟體基金會的開放原始碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。
學習該技術的原因:因為專案需要解析使用者上傳的Excel的資料。

技術詳述。

流程圖:

Excel內容:

傳入一個EXCEL檔案並讀取。

    public static List<Student> getExcelInfo(MultipartFile mFile) {
        String fileName = mFile.getOriginalFilename();
        if (fileName == null) {
            fileName = "";
        }
        List<Student> stuList = null;
        try {
            if (!validateExcel(fileName)) {
                return null;
            }
            boolean isExcel2003 = true;
            if (isExcel2007(fileName)) {
                isExcel2003 = false;
            }
            stuList = createExcel(mFile.getInputStream(), isExcel2003);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return stuList;
    }

根據Excel裡面的內容讀取客戶資訊。

    public static List<Student> createExcel(InputStream is, boolean isExcel2003) {
        List<Student> stuList = null;
        try{
            Workbook wb = null;
            if (isExcel2003) { // 當excel是2003時,建立excel2003
		wb = new HSSFWorkbook(is);
	    } else { // 當excel是2007時,建立excel2007
		wb = new XSSFWorkbook(is);
	    }
            stuList = readExcelValue(wb);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stuList;
    }

讀取Excel裡面的資訊。

    private static List<Student> readExcelValue(Workbook wb) {
        //獲取第一個Sheet
        Sheet sheet = wb.getSheetAt(0);
        totalRows = sheet.getPhysicalNumberOfRows();
        if (totalRows > 1 && sheet.getRow(0) != null) {
            totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
        }
        List<Student> studentList = new ArrayList<Student>();

        //遍歷該Sheet的行
        for (int r = 1; r < totalRows; r++) {
            Row row = sheet.getRow(r);
            if (row == null){
                continue;
            }
            Student student = new Student();

            //遍歷該行的列
            for (int c = 0; c < totalCells; c++) {
                Cell cell = row.getCell(c);
                if (c == 0) {
                    student.setAccount(getValue(cell));
                } else if(c == 1) {
                    student.setStudentName(getValue(cell));
                } else if(c == 2) {
                    student.setEmail(getValue(cell));
                }
            }

            studentList.add(student);
        }
        return studentList;
    }

解決excel型別問題。

    public static String getValue(Cell cell) {
        String value = "";
        if(null==cell){
            return value;
        }
        switch (cell.getCellType()) {
            //數值型
            case NUMERIC:
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    value = format.format(date);;
                }else {
                    BigDecimal big= BigDecimal.valueOf(cell.getNumericCellValue());
                    value = big.toString();
                    if(null!=value&&!"".equals(value.trim())){
                        String[] item = value.split("[.]");
                        if(1<item.length&&"0".equals(item[1])){
                            value=item[0];
                        }
                    }
                }
                break;
            //字串型別   
            case STRING:
                value = cell.getRichStringCellValue().toString();
                break;
            //公式型別   
            case FORMULA:
                //讀公式計算值
                value = String.valueOf(cell.getNumericCellValue());
                if (value.equals("NaN")) {
                    value = cell.getStringCellValue().toString();
                }
                break;
            //布林型別
            case BOOLEAN:
                value = ""+ cell.getBooleanCellValue();
                break;
            default:
                value = cell.getStringCellValue().toString();
        }
        if("null".endsWith(value.trim())){
            value="";
        }
        return value;
    }

驗證Excel格式。

    public static boolean validateExcel(String filePath) {
        if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
            errorMsg = "檔名不是excel格式";
            return false;
        }
        return true;
    }

技術使用中遇到的問題和解決過程。

不懂怎麼解析Excel。去百度並學習了用poi解析Excel,讀取Excel中的資料。

總結。

POI可以很方便地對Excel進行解析,讀取Excel中的資料。

參考文獻、參考部落格。

SSM中使用POI實現excel的匯入匯出
POI操作excel基礎用法詳解
SSM專案的excel檔案上傳並新增到資料庫
java解析excel解決excel型別問題