POI导入Excel

Excel文件通过POI导入

1.加入相关依赖

 		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
		<!--4.1版本导入2017版Excel文件找不到其中必须的一个类,在中央仓库导入最新版本的jar以解决-->
  		<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>

2.读取Excel文件

  /**
     *
     * @param inputStream Excel文件输入你
     * @param suffix    Excel文件后缀名,根据后缀名选择2013或者2017版
     * @param startRow  选择从Excel表格的第几行开始输出,从0开始
     * @return   List<String[]> 
     * @throws IOException
     */
    public List<String[]> parseExcel(InputStream inputStream, String suffix, int startRow) throws IOException {
        //定义excel对象变量
        Workbook workbook = null;
        //判断后缀
        if ("xls".equals(suffix)) {
            //2003
            workbook = new HSSFWorkbook(inputStream);
        } else if ("xlsx".equals(suffix)) {
            //2007
            workbook = new XSSFWorkbook(inputStream);
        } else {
            return null;
        }
        //获取工作表 excel分为若干个表 sheet
        Sheet sheet = workbook.getSheetAt(0);
        if (sheet == null) {
            return null;
        }
        //获取表格中最后一行的行号
        int lastRowNum = sheet.getLastRowNum();
        if (startRow >= lastRowNum) {
            return null;
        }

        List<String[]> result = new ArrayList<>();
        //定义行和列变量
        Row row = null;
        Cell cell = null;
        for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) {
            row = sheet.getRow(rowNum);
            //获取当前行的第一列和最后一列的标记
            short firstCellNum = row.getFirstCellNum();
            short lastCellNum = row.getLastCellNum();
            if (lastCellNum != 0) {
                String[] rowArray = new String[lastCellNum];
                for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                    cell = row.getCell(cellNum);
                    //判断单元格是否有数据
                    if (cell == null) {
                        rowArray[cellNum] = null;
                    } else {
                        rowArray[cellNum] = parCell(cell);
                    }
                }
                result.add(rowArray);
            }
        }
        return result;
    }

3.解析单元个数据

 /**
     * 解析单元格
     * @param cell 一个单元格
     * @return  将单元格数据转为String类型
     */
    private String parCell(Cell cell) {
        String cellStr = null;
        //判断单元个的类型
        switch(cell.getCellTypeEnum()){
            case STRING:
                //字符串单元格
                cellStr=cell.getRichStringCellValue().toString();
                break;
            case BLANK:
                //空数据
                cellStr=null;
                break;
            case NUMERIC:
                //数学类型
                //判断日期类型
                if (HSSFDateUtil.isCellDateFormatted(cell)){
                    //判断具体类型     日期 /时间
                    SimpleDateFormat simpleDateFormat=null;
                    if (cell.getCellType()== HSSFDataFormat.getBuiltinFormat("h:mm")){
                        //时间
                        simpleDateFormat=new SimpleDateFormat("HH:mm");
                    }else {
                        //日期
                        simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
                    }
                    Date temp=cell.getDateCellValue();
                    cellStr=simpleDateFormat.format(temp);
                }else {
                    //数字
                    double numericCellValue = cell.getNumericCellValue();
                    //数字格式化工具
                    DecimalFormat decimalFormat = new DecimalFormat();
                    //查看单元格中的具体样式类型
                    String dataFormatString = cell.getCellStyle().getDataFormatString();
                    if (dataFormatString.equals("General")){
                        //定义格式化正则,使用具体有效数据进行,且只保留有效数据
                        decimalFormat.applyPattern("#");
                    }
                    cellStr=decimalFormat.format(numericCellValue);
                }
                break;
            case BOOLEAN:
                cellStr=String.valueOf(cell.getBooleanCellValue());
                break;
            default:
                cellStr=null;
        }
        return cellStr;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值