利用POI讀取excel

1、poi簡介
  Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。
2、maven依賴

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.16</version>
</dependency>

3、ExcelReaderUtil.java

public class ExcelReaderUtil {
    // 默認單元格內容爲數字時格式
    private static DecimalFormat df = new DecimalFormat("0");
    // 默認單元格格式化日期字符串
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static class ExcelRow {
        //所在行標,從1開始
        private int row;
        //該行數據
        private List<Object> datas = new ArrayList<>();
        public int getRow() {
            return row;
        }
        public void setRow(int row) {
            this.row = row;
        }
        public List<Object> getDatas() {
            return datas;
        }
        public void setDatas(List<Object> datas) {
            this.datas = datas;
        }
        @Override
        public String toString() {
            return "[" + datas + "]";
        }
    }

    /**
     * 讀取Excel文件,支持2007和2003兩種版本
     * 去掉空行,空單元格對應"",浮點數原樣輸出
     * @param inputStream   輸入流
     * @param containTitle  是否包含表頭
     * @return
     * @throws IOException
     * List<List<Object>>
     */
    @SuppressWarnings("deprecation")
    public static List<ExcelRow> readExcel(InputStream inputStream, boolean isExcel2007, boolean containTitle) throws IOException {
        List<ExcelRow> rowList = new ArrayList<>();
        try {
            //初始化Workbook對象
            Workbook wb = null;
            if (isExcel2007) {
                wb = new XSSFWorkbook(inputStream);
            } else {
                wb = new HSSFWorkbook(inputStream);
            }
            //讀取標題行,獲取列數
            Sheet sheet = wb.getSheetAt(0);
            //第一列開始的行標
            int firstRowNum = sheet.getFirstRowNum();
            int lastRowNum = sheet.getLastRowNum();
            Row row = sheet.getRow(firstRowNum);
            //表頭列數
            int firstCellNum = row.getFirstCellNum();
            int lastCellNum = row.getLastCellNum();

            //遍歷數據表,i是遊標,要將有數據的讀完,中間沒數據的行也加入
            int i = firstRowNum;
            if (!containTitle) {
                i =  firstRowNum +1;
            }
            for (; i < lastRowNum + 1 ; i++) {
                row = sheet.getRow(i);
                //一行數據
                List<Object> colList = new ArrayList<Object>();
                if (row == null) {
                    continue;
                }
                boolean allBlank = true;
                for (int j = firstCellNum; j < lastCellNum ; j++) {
                    Cell cell = row.getCell(j);
                    Object value = "";
                    if (cell == null) {
                        colList.add(value);
                        continue;
                    }
                    switch (cell.getCellType()) {
                        case XSSFCell.CELL_TYPE_STRING:
                            value = cell.getStringCellValue();
                            break;
                        case XSSFCell.CELL_TYPE_NUMERIC:
                            if ("@".equals(cell.getCellStyle().getDataFormatString())) {
                                value = df.format(cell.getNumericCellValue());
                            } else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
                                double num = cell.getNumericCellValue();
                                if(isInteger(num)) {
                                    value = df.format(cell.getNumericCellValue());
                                } else {
                                    value = num;
                                }
                            } else {
                                value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
                            }
                            break;
                        case XSSFCell.CELL_TYPE_BOOLEAN:
                            value = Boolean.valueOf(cell.getBooleanCellValue());
                            break;
                        case XSSFCell.CELL_TYPE_BLANK:
                            value = "";
                            break;
                        default:
                            value = cell.toString();
                    }// end switch
                    if(StringUtils.isNotBlank(value.toString())){
                        allBlank = false;
                    }
                    colList.add(value);
                } // end for j
                if (!allBlank) {
                    ExcelRow excelRow = new ExcelRow();
                    excelRow.setRow(i+1);
                    excelRow.setDatas(colList);
                    rowList.add(excelRow);
                }
            } // end for i
            wb.close();
        } catch (OfficeXmlFileException e){
            throw new IOException("文件後綴與實際文件類型不符", e);
        }
        return rowList;
    }
    //判斷整數(int)
    private static boolean isInteger(double value) {
        if(value % 1 == 0){// 是這個整數,小數點後面是0
            return true;
        }else{//不是整數,小數點後面不是0
            return false;
        }
    }
}

4、調用

boolean isExcel2007 = false;
if (StringUtils.endsWithIgnoreCase(fileName, ".xlsx")) {
    isExcel2007 = true;
}
List<ExcelRow> datas = ExcelReaderUtil.readExcel(file.getInputStream(), isExcel2007, true);
String col1 = (String) datas.get(i).getDatas().get(0);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章