当前位置:首页 > java > 正文内容

java poi读取excel文件(xlsx)

关中浪子3年前 (2022-06-10)java2272
买泛域名SSL证书 送5斤装现摘猕猴桃一箱、同时提供技开源商城搭建免费技术支持。
泛域名ssl证书 239元1年送1个月、单域名39元1年,Sectigo(原Comodo证书)全球可信证书,强大的兼容性,高度安全性,如有问题7天内可退、可开发票
加微信VX 18718058521 备注SSL证书
【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价

poi读取excel文件

先maven导入jar包

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.8</version>
</dependency> 

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

 读取后缀为“xlsx”的excel文件代码 (“xls”不适用,“xls”得用 HSSFWorkbook)。

    /**
     * @param file       需要读取的Excel文件
     * @param sheetIndex 读取的Excel文件中的表格下标
     * @return 数据的坐标,对应的值
     */
    public static ArrayList<ArrayList<Object>> readExcel(File file, Integer sheetIndex) {
        ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
        FileInputStream fileInputStream = null;
        try {
            ArrayList<Object> colList;
            fileInputStream = new FileInputStream(file);
            XSSFWorkbook wb = new XSSFWorkbook(fileInputStream);
            XSSFSheet sheet = wb.getSheetAt(sheetIndex);
            XSSFRow row;
            XSSFCell cell;
            Object value;
            for (int i = sheet.getFirstRowNum(), rowCount = 0; rowCount < sheet.getPhysicalNumberOfRows(); i++) {
                row = sheet.getRow(i);
                colList = new ArrayList<Object>();
                //当读取行为空时
                if (row == null) {
                    //判断是否是最后一行,不是最后一行添加上无数据的集合
                    if (i != sheet.getPhysicalNumberOfRows()) {
                        rowList.add(colList);
                    }
                    continue;
                } else {
                    rowCount++;
                }
                for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
                    if (j < 0) {
                        continue;
                    }
                    cell = row.getCell(j);
                    //当该单元格为空
                    if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) {
                        //判断是否是该行中最后一个单元格
                        if (j != row.getLastCellNum()) {
                            colList.add("");
                        }
                        continue;
                    }
                    //根据数据类型来获取值
                    switch (cell.getCellTypeEnum()) {
                        case STRING:
                            value = cell.getStringCellValue();
                            break;
                        case NUMERIC:
                            if (cell.getCellStyle().getDataFormatString().contains("m/d/yy")) {
                                value = SimpleDateFormatAddUtil.DateTOString(cell.getDateCellValue());
                            } else if (cell.getCellStyle().getDataFormatString().contains("yyyy/m/d")) {
                                value = SimpleDateFormatAddUtil.DateTOString(cell.getDateCellValue());
                            } else if (cell.getCellStyle().getDataFormatString().equals("General")) {
                                value = getRealStringValueOfDouble(cell.getNumericCellValue());
                            } else {
                                try {
                                    value = getRealStringValueOfDouble(cell.getNumericCellValue());
                                }catch (Exception e){
                                    value=cell.toString();
                                }
                            }
                            break;
                        case BOOLEAN:
                            value = Boolean.valueOf(cell.getBooleanCellValue());
                            break;
                        case BLANK:
                            value = "";
                            break;
                        case FORMULA: //公式类型
                            value = parseFormula(cell);
                            break;
                        default:
                            value = cell.toString();
                    }
                    colList.add(value);
                }
                rowList.add(colList);
            }
            wb.close();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                if (null != fileInputStream) {
                    fileInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return rowList;
    }


    /**
     * 解析公式
     * @param cell - 单元格
     * @return String - 结果
     */
    public static String parseFormula(Cell cell) {
        String data = null;
        switch (cell.getCachedFormulaResultTypeEnum()) {
            case NUMERIC:
                if (0 == cell.getCellStyle().getDataFormat()) {
                    data = String.format("%.4f", cell.getNumericCellValue());
                } else {
                    data = String.valueOf(cell.getNumericCellValue());
                }
                break;
            case STRING:
                data = String.valueOf(cell.getRichStringCellValue());
                break;
            case BOOLEAN:
                data = String.valueOf(cell.getBooleanCellValue());
                break;
            case ERROR:
                data = String.valueOf(cell.getErrorCellValue());
                break;
            default:
                data = cell.getCellFormula();
        }
        return data;
    }

    private static String getRealStringValueOfDouble(Double d) {
        String doubleStr = d.toString();
        boolean b = doubleStr.contains("E");
        int indexOfPoint = doubleStr.indexOf('.');
        if (b) {
            int indexOfE = doubleStr.indexOf('E');
            BigInteger xs = new BigInteger(doubleStr.substring(indexOfPoint
                    + BigInteger.ONE.intValue(), indexOfE));
            int pow = Integer.valueOf(doubleStr.substring(indexOfE
                    + BigInteger.ONE.intValue()));
            int xsLen = xs.toByteArray().length;
            int scale = xsLen - pow > 0 ? xsLen - pow : 0;
            doubleStr = String.format("%." + scale + "f", d);
        } else {
            Pattern p = Pattern.compile(".0$");
            java.util.regex.Matcher m = p.matcher(doubleStr);
            if (m.find()) {
                doubleStr = doubleStr.replace(".0", "");
            }
        }
        return doubleStr;
    }


找梯子最重要的就是稳定,这个已经上线三年了,一直稳定没有被封过,赶紧下载备用吧!

扫描二维码推送至手机访问。

版权声明:本文由码农翻生发布,如需转载请注明出处。

本文链接:https://lubojian.cn/post/181.html

分享给朋友:

相关文章

springmvc学习返回视图或字符串

springmvc学习返回视图或字符串

返回试图1:直接返回String字符串,拼接前后缀,进行页面跳:2:返回modelAndView,拼接前后缀,返回页面success.jsp3:注入modelAndView,拼接前后缀返回页面success.jsp4:把model与view...

JAVA 基础练习题 JAVA教程 基础

1变量、运算符和类型转换:1.1手动输入一个学生的成绩,对这个成绩进行一次加分,加当前成绩的20%,输出加分后成绩        Scanner scan = new Scanner(System.i...

SpringBoot   http请求 提交日期参数 转换失败的解决方法 (无法自动转换字符串到日期)

SpringBoot http请求 提交日期参数 转换失败的解决方法 (无法自动转换字符串到日期)

如果你有类似如下报错信息,可阅读此文尝试解决:2018-08-18 14:05:17.687  WARN 17100 --- [p-nio-80-exec-2] .w.s...

poi4.0.0读取excel文件时报java.lang.NoClassDefFoundError: org/apache/commons/compress/archivers/zip/ZipFile

最近想用poi写个处理excel的工具,看了一下poi的官网,出了个4.0.0的版本,于是想尝尝鲜,下载了一把poi4.0.0的bin。下载的是下面的文件: 下载完,将压缩包里所有的jar包导入到工程中(当然,如果只需要处理exc...

Spring Boot + MyBatis + MySQL 实现读写分离!不懂多看

Spring Boot + MyBatis + MySQL 实现读写分离!不懂多看

1、引言读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程序...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。