资讯专栏INFORMATION COLUMN

java使用poi读取excel文档的一种解决方案

legendaryedu / 1848人阅读

摘要:本人在学习使用的过程中,需要验证一下表格里面的数据是否与数据库中的数据相等。上网看了一下资料自己写了一个读取文档的方法,验证数据库的方法暂时还没写,自娱自乐,只能抽时间了。现在把读取的方法分享出来。在读取行数据的时候先转换了一下格式。

本人在学习使用java的过程中,需要验证一下excel表格里面的数据是否与数据库中的数据相等。由于数据太多,故想着用java读取excel数据再去数据库验证。上网看了一下资料自己写了一个读取excel文档的方法,验证数据库的方法暂时还没写,自娱自乐,只能抽时间了。现在把读取excel的方法分享出来。

    //读取excel文档,除第一行为标题外内容为数字
    public static List>> readExcel(File filepath) throws Exception{
        /*首先判断文件是否存在
         * 在判断文件类型,xls还是xlsx
         */
        if (!filepath.exists()) {
            output("文件不存在!");
            }
        String  filename = filepath.toString();//转化为string类型
        String fileType = filename.substring(filename.lastIndexOf(".") + 1, filename.length());//提取文件名后缀
        InputStream is = null;
        Workbook wb = null;
        try {
            is = new FileInputStream(filepath);
            if (fileType.equals("xls")) {
                wb = new HSSFWorkbook(is);
                } else if (fileType.equals("xlsx")) {
                    wb = new XSSFWorkbook(is);
                    } else {
                        output("文件名错误!");
                        }
            //新建集合,考虑到要用value值去查询数据库,所以value设置为string类型
            List>> result = new ArrayList>>();
            int sheetSize = wb.getNumberOfSheets();//获取表格的个数
            for (int i = 0; i < sheetSize; i++) {//遍历所有表格
                Sheet sheet = wb.getSheetAt(i);
                List> sheetList = new ArrayList>();
                List titles = new ArrayList();//放置所有的标题
                int rowSize = sheet.getLastRowNum() + 1;//此处getLastRowNum()方法获取的行数从0开始,故要+1
                for (int j = 0; j < rowSize; j++) {//遍历所有行
                    Row row = sheet.getRow(j);
                    if (row == null) {//略过空行
                        continue;
                        }
                    int cellSize = row.getLastCellNum();//获取列数
                    if (j == 0) {//第一行是标题行
                        for (int k = 0; k < cellSize; k++) {//添加到标题集合中
                            Cell cell = row.getCell(k);
                            titles.add(cell.toString());
                            }
                        } else {//其他行是数据行,为数字
                            Map rowMap = new HashMap();//保存一行的数据
                            for (int k = 0; k < titles.size(); k++) {//遍历保存此行数据
                                Cell cell = row.getCell(k);
                                String key = titles.get(k);
                                String value = null;
                                if (cell != null) {
                                    /*这里因为读取excel数据默认值是double类型的,但我的数据都是整数,为了方便先进行一次转换
                                     * 先判断数据类型,然后先转换然后在复制给value
                                     * 数值类型是0,字符串类型是1,公式型是2,空值是3,布尔值4,错误5
                                     */
                                    if (row.getCell(k).getCellType() == 0) {
                                        value =(int) row.getCell(k).getNumericCellValue()+"";
                                        }else {
                                            value = cell.toString();//转换成string赋值给value
                                            }
                                    }
                                rowMap.put(key, value);//把数据存入map集合
                                }
                            sheetList.add(rowMap);//把存好行的数据存入表格的集合中
                            }
                    }
                result.add(sheetList);//把表格的数据存到excel的集合中
                }
            return result;
            } catch (FileNotFoundException e) {
                throw e;
                } finally {
                    if (is != null) {
                        is.close();
                        }
                    }
        }

方法的思路是从网上看来的,中间把代码敲了一遍,发现很多地方不太对,不知道是不是因为年份久远的原因。这个方法我做了一些自己的优化,输入参数那个地方我改成了file类型,判断了一下文件是否存在。在读取行数据的时候先转换了一下格式。中文的注释,我也自己重新写了一遍。希望能对你有所帮助。

一起来~FunTester

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75840.html

相关文章

  • java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) exce

    摘要:消费之后,多线程处理文件导出,生成文件后上传到等文件服务器。前端直接查询并且展现对应的任务执行列表,去等文件服务器下载文件即可。这客户体验不友好,而且网络传输,系统占用多种问题。拓展阅读导出最佳实践框架 产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件。 需求分析 对于 excel 导出,是一个很常见的需求。 最常见的解决方案就是使用 poi 直接同步导出一个 exc...

    K_B_Z 评论0 收藏0
  • 使用ApachePOI生成XLSX格式Excel文档大数据量导出

    摘要:最近在做使用进行大数据量导出,现在把其整理成工具类供大家参考。版本增加了前缀为相关的类,主要用于大数据量的写入与读取。 最近在做使用POI进行大数据量导出,现在把其整理成工具类供大家参考。Apache POI 3.8版本增加了前缀为SXSSF相关的类,主要用于大数据量的写入与读取。关于ApachePOI导出Excel基本的使用我这里就不详解了,具体参考: Apache POI官方网站...

    Shihira 评论0 收藏0
  • POI Sax 事件驱动解析Excel2007文件(较大数据量的读存导出)

    摘要:方式解析全称,它是一个接口,也是一个软件包。另外,推模型可用于广播环境,能够同时注册多个,并行接收事件,而不是在一个管道中一个接一个地进行处理。这些语法分析器是最灵活的,因为它们还支持。 xcel2007版本的代码如下,本文主要是用于POI解析大文件Excel容易出现内存溢出的现象而提出解决方案,故此解决了大数据量的Excel文件解析的难度,在此拿出来贡献给大家,谢谢! 1.Offic...

    cod7ce 评论0 收藏0
  • 慕课网_《解密JAVA实现Excel导入导出》学习总结

    时间:2017年07月06日星期四说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 预备知识 基础知识 struts2框架(上传下载功能) xml解析技术(导入模板) JQuery EasyUI(前台美观) 课程目录 实现方式 定制导入模版 导入文件 导...

    enrecul101 评论0 收藏0
  • POI读取文件的最佳实践

    摘要:我最近做的一个工具就是读取计算机中的以及文件。经常在读取某些特别大的文件的时候都会带来一个内存溢出的问题。以上,就是我在使用读取文件的一些探索和发现,希望对你能有所帮助。 POI是 Apache 旗下一款读写微软家文档声名显赫的类库。应该很多人在做报表的导出,或者创建 word 文档以及读取之类的都是用过 POI。POI 也的确对于这些操作带来很大的便利性。我最近做的一个工具就是读取计...

    bingchen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<