Poi实现Excel的导入

前面写过一篇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作区分了;

时间: 2024-12-11 16:41:47

Poi实现Excel的导入的相关文章

poi实现excel的导入导出

import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.

Apache poi 固定Excel 表格导入数据库方法(列名对应数据库字段名)

java的poi技术读取Excel数据到MySQL

poi 获取excel数据 导入数据库

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { MultipartFile file =

poi实现excel数据导入数据库

1.导入相应的jar包 2.创建上传文件的表单,注意method="post" enctype="multipart/form-data" 3.主要代码实现 a.controller层 获得文件输入流,调用service方法 b.批处理sql语句书写

如何使用POI对Excel表进行导入和导出

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 结构: HSSF - 提供读写Microsoft Excel格式档案的功能. XSSF - 提供读写Microsoft Excel OOXML格式档案的功能. HWPF - 提供读写Microsoft Word格式档案的功能. HSLF - 提供读写Microsoft PowerPoint格式档案的功能. HDGF - 提供读写Microsoft

【原创】POI操作Excel导入导出工具类ExcelUtil

关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.ThreadLocalMap以当前ThreadLocal为key进行存储,设置一次变量,则其他线程也会有上次数据的残留,因此在addMergeArea方法中进行清空的操作.为了保证原子性, 采用ReentrantLock确保一次只有一个线程可以进行添加合并数据的操作. 线程安全性从以上两个方面保证. 水

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

poi excel批量导入 解决各类型的数据

String value=this.getValue((HSSFCell) row.getCell(position)) 数字类型  时间类型 字符串类型验证没问题, 数字类型如果是1234.0会将其变成1234  如果是1234.5保存仍然保持小数位1234.5,用来解决电话号码和普通数字问题 时间类型将其格式化成了 2015-12-09 12:13:12这种格式便于保存数据库 //解决类型问题,获得数值 public String getValue(HSSFCell cell) { Stri

Java的poi技术读取和导入Excel

报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑.Java程序由于其跨平台特性,不能直接操纵Excel.因此,本文探讨一下POI视线Java程序进行Excel的读取和导入. AD:WOT2014:用户标签系统与用户数据化运营培训专场 项目结构: 用到的Excel文件: XlsMain .java 类 //该类有main方法,主要负责运行程序,同时该类中也包含了用poi读取Excel(2003版) import java.io.FileInputSt