前面写过一篇HSSF(实际上就是Poi)实现Excel导出的随笔,正好最近也有做导入的需求,那么就索性再写一篇Poi导入Excel的随笔吧。

其实,poi导入Excel和Poi导出Excel在实现步骤上是大同小异的,但是做这个之前,有一个问题需要搞清楚,Excel文件的分类,Excel有2003板,后缀为.xls和2007板,后缀为.xlsx,而Poi解析这两种文件的时候,使用的类是不同的,前者使用的是HSSFWorkBook,后者是XSSFWorkBook;

搞清楚了这个,接下来就可以开始Excel的导入操作了

第一步,将这个Excel文件读取成为一份WorkBook(假使得到是一个文件)
  WorkBook mWorkBook = null;
  String fileName = file.getName();
  String type = fileName.split(fileName.lastIndexOf(".")+1,fileName.length);
  FileInputStream mStream = new FileInputStream(file);
  mWorkBook = "xls".equals(type) ? new HSSFWorkBook(mStream) : new XSSFWorkBook(mStream);

第二步,得到对应的sheet页,并得到行和列的数据

  Sheet sheet0 = mWorkBook.getSheetAt(0);
  Row row0 = sheet0.getRow(0);
  int rowNum = sheet0.getLastRowNum();
  int columeNum = row0.getPhysicalNumberOfCells();

得到了总的行数和列数,接下来就可使用 双重for循环对没个单元格的内容进行获取;
为了避免遗忘,还是举个例子吧,有一张记录人信息的Excel表格,表格有3列,分别是name,age,sex
那么你可以建立一个实体类Person,拥有name,age,sex三个属性

好了,接下来就进行数据的读取储存
  List<Person> list = new ArrayList<>();
  Person person;
  for(int i = 1 ; i<rowNum ; i++){
    Row row = sheet0.getRow(i);
    for(int j = 0; j<columeNum ; j++){
      Cell cell = row.getCell(j);
      person = new Person();
      swich(j){
        case 1 :
          person.setName(cell.getStringCellValue());
          break;
        case 2 :
          person.setAge(cell.getNumericCellValue());
          break;
        case 3 :
          person.setSex(cell.getStringCellValue());
        }
      list.add(person);
    }
  }

这样完成了对Excel的解析

在这里要说一个比较蛋疼的问题,那就是Excel单元格的格式,通过上面的例子看到了,不同格式的单元格的内容的获取,Poi提供的接口是不一样的,数字类型的getNumericCellValue,文本类型的getStringCellValue,当然还有boolean类型和Date类型等,这么多的类型,如果使用的API不对,那么就GG了。

对于一些可以有明确的格式的单元格还好,如姓名一看就是文本类型,年龄是数字类型,这些获取的时候可以明确的知道要用哪个,但是还有一些如日期,用起来就有点蛋疼了;

获取你会说,日期啊,当然是文本类型了,那么我只能说错,大错特错,虽然开始我也是这么以为的,但只要稍微的验证一下就会发现,在不对单元格格式作出规定时,合法的日期格式诸如: 1月1日,2017/1/1,2017-1-1 这些,单元格内容的获取要是用getNumericCellValue, 但是不合法的日期格式,如:13月1日,2017/13/1等,单元格内容的获取又变为了getStringCellValue,
当然在不需要对日期的格式进行校检的情况下,这也不是什么大问题,可以使用如下方法进行获取
try{
cell.getNumericCellValue();
}catchh(Exception e){
cell.getStringCellValue();
}

但是如果要对日期格式进行校验,如规定你输入的格式需要是2017/1/1、2017/01/01类似的,上面的方法就行不通了,你会发现,你写在Excel中的日期2017/01/01在通过getNumericCellValue之后变成了float类型的数据。这就很操蛋了,日期的格式丢失了,虽然可以使用SimpleDateFormat重新转化为日期格式,但是,显然这是一个新的格式,校检这个毫无意义啊。

这就尴尬了,我暂时没有发现什么办法可以进行校检,不过最后的解决办法就是,我来提供你填写Excel的模板,在模板中规定,你的这一列数据的数据格式为文本
CellStyle style = mWorkBook.createCellStyle();
HSSFDataFormat format = mWorkBook.createDataFormat();
style.setDataFormat(format.getFormat("@"));
sheet1.setDefaultColumeStyle(index,style);

好了,有了模板,日期的格式就被固定为了文本,这样获取的时候统一使用getStringCellValue(),这样日期的格式也不会丢失了,而且,导出的模板规定了文件的类型,也可以不为到底使用XSSFWorkBook还是HSSFWorkBook作区分了;

转载于:https://www.cnblogs.com/hugystudy/p/6811449.html

Poi实现Excel的导入相关推荐

  1. 蓄力-利用POI进行excel的导入导出(包含图片)

    这里写自定义目录标题 利用POI进行excel的导入导出 引入的jar包 excel导入 主方法: 将excel里面的图片转成数据 xls格式 xlsx格式 将图片数据转成字节流的方式传输到FTP服务 ...

  2. 手摸手教学-利用原生POI对excel的导入导出以及阿里的easyexcel的基本操作

    文章目录 原生POI对excel的导入导出以及阿里的easyexcel的基本操作 首先是最原始的POI操作excel 其次是POI操作excel对数据库的导入导出 最后是阿里的easyexcel的简单 ...

  3. POI之Excel简单导入

    开心一笑 一日 一对屎壳郎母子在一起吃午餐 儿子问妈妈:为什么我们每天都吃大便啊 妈妈生气的说:吃饭的时候不要说这么恶心的话,趁热吃!! 视频教程 大家好,我录制的视频<Java之优雅编程之道& ...

  4. SpringBoot+Vue+POI实现Excel的导入与导出

    文章目录 前言 POI中文操作API文档 导入Excel文件 导出Excel 总结 前言 继上一篇Excel的模板下载后,就此更新企业开发中常常需要使用到的Excel的导入与导出.Excel的解析需要 ...

  5. 使用POI实现Excel导出导入 详细解释

    前景:java中操作图形化API难免有些困难,这时就会有大神来封装这些API 目前热门:收费iText,免费apache-poi 使用办公文档的核心理想:把办公软件中的元素封装成java类,程序员只需 ...

  6. Poi的Excel的导入导出 支持2007

    需要导入 poi-3.7.jar commons-io-2.4.jar Excel2003导出 import java.io.File; import java.io.FileOutputStream ...

  7. POI实现excel的导入和导出

    03最多是65536  xls 对象HSSFWorkbook 07没有限制 xlsx 对象XSSFWorkbook 升级版SXSSFWorkbook 工作博 工作表sheet 行 列 从0开始 < ...

  8. java使用POI实现Excel批量导入数据。

    1.背景 项目中有使用easypoi,处理常规excel问题,但是现在有个需求,需要动态生成导出的报表字段.同时,根据导入的excel,增加数据信息.(有可能会出现,导入的报表是几天前下载的,不会最新 ...

  9. 通过POI操作Excel的导入导出

    项目地址https://github.com/zhuhaitao666/excel.git 这里罗列部分核心代码 1.引入依赖和配置 <dependency><groupId> ...

最新文章

  1. DSP28335声音降噪(未完成)
  2. ECMAScript 6入门
  3. 创建vue项目(一)搭建vue-cli、项目文件介绍、简单配置
  4. 关闭SQLite3中的journal暂存档
  5. 用计算机MR,计算机上的【MC、MR、M
  6. not supported between instances of 'SafeText' and 'int' 问题出现以及解决
  7. 迪士尼前高管凯文·梅耶尔加盟字节跳动,出任COO
  8. char类型输出地址
  9. 情人节来了,教你个用 Python 表白的技巧
  10. C#编程(六十六)----------表达式树总结
  11. 系统架构师必须掌握的英语单词
  12. rabbitmq:publisher confirms
  13. pacemaker+corosync+pg13
  14. 几种常见的提取关键词的算法(4)
  15. 孙陶然:有能力的第一个标准是解决问题
  16. 关于NXP 汽车ABS ASIC芯片BA13系列轮速部分驱动
  17. 利用Java简单的实现围棋小游戏
  18. 同时查询圆通多个快递物流,并分析派件时效
  19. 【如何成为学习高手】学习是有方法的,按照正确的方法练习,每个人都可以成为学霸
  20. Java基础学习第二讲:Java数据类型,变量及常量

热门文章

  1. linux 权限分割,sudo使用之实现权限分配
  2. linux as5 启动mysql_RedHat AS5 PHP添加JSON模块
  3. qjsonarray 合并_QJsonObject和QJsonArray的巨坑
  4. cassss服务未启动_不要再本地启动项目调试了,试SpringBoot远程调试你会发现新大陆!...
  5. win7计算机右键直接有设备管理器等相关,为什么我的计算机点击右键后里头没有设备管理器了?windows7旗舰版的,不知怎么就不见了...
  6. siob执行多条sql写法及创建表添加字段
  7. jquery给div赋值
  8. 微软公告:Visual Basic 6 完全兼容 Windows 8 的整个产品周期
  9. [vb]利用WScript.Shell对象隐藏cmd命令行运行
  10. 惹怒程序员的下场!阿里达摩院大神受不了骚扰电话,业余发起“二哈”AI,315后爆红...