记录POI方式如何读取excel文档单元格数据

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路记录POI方式如何读取excel文档单元格数据,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1. 先上一段代码

public String importExcelFile(MultipartFile file) throws IOException 
{
        int startRow = 0;
        int count = 0;
        if (file.isEmpty()) {
            throw new MyException(MyCodeEnum.PARAMETER_ERROR,"上传的文件不能为空");
        }
        InputStream inputStream = file.getInputStream();
        //文件的原名称
        long size = file.getSize();
        String originalFilename = file.getOriginalFilename();
        String fileExtName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        logger.info("upload file path: " + originalFilename);
        Date date = new Date();
        // 获取当前操作用户名, 可忽略这段代码
        ActiveUser activeUser = (ActiveUser) SecurityUtils.getSubject().getPrincipal();
        String operator = activeUser.getUser().getUsername();
        
        Workbook wb = null;
        try {
            wb = WorkbookFactory.create(inputStream);//new FileInputStream(inputStream)
            Sheet sheet = wb.getSheetAt(0);
            startRow = 9;    // 从excel第9行开始遍历

            int endRow = sheet.getLastRowNum();  // 获取该excel最后一行长度
            while (startRow <= endRow) {
                Row row = sheet.getRow(startRow);  // 获取每一行数据

                String info1 = getCellValue(row, 0);   // 获取该行第0列数据xxx
                ...
                String infon = getCellValue(row, n);   // 获取该行第n列数据xxx
                System.out.println(info1);
				startRow++;
                count++;
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
        } finally {
            try {
                wb.close();
            } catch (Exception e) {
                logger.error(e.getMessage());
            }
        }
        //TODO
        return  "共导入" + count + "行数据";
}

private String getCellValue(Row row, int cellIndex) {
        logger.info("row: " + row.getRowNum() + " cellIndex: " + cellIndex);
        if (row.getCell(cellIndex) == null || row.getCell(cellIndex).getCellTypeEnum() == CellType.BLANK)
            return "";
        // formatter 格式化, 可以读取任何类型的cell数据,避免了去判断cell类型是String还是Numberic等等
        DataFormatter formatter = new DataFormatter();
        logger.info(formatter.formatCellValue(row.getCell(cellIndex)));
        return formatter.formatCellValue(row.getCell(cellIndex));
}

重点

读取excel默认行、列索引都是从0开始。

重点在一开始读取它时String数据使用

row.getCell(cellIndex).getStringCellValue();

数值类型数据读取调用

row.getCell(cellIndex).getNumericCellValue();

这样太死板,一旦excel某一列本身不是对应数据类型还得做异常校验,故采用了上述代码里的:

DataFormatter formatter = new DataFormatter();
formatter.formatCellValue(row.getCell(cellIndex));

ps:另外有个问题,当读取的excel行数较多时,

wb = WorkbookFactory.create(inputStream);

这段代码执行的特别慢,目前没啥好解决的办法,留待以后再说,若有好的解决办法,还请不吝赐教,深表感谢。

参考博客:
完美解决读取Excel的数字单元格时Cannot get a STRING value from a NUMERIC cell 报错处理


不积跬步无以至千里。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/157315.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!