java使用POI导入excel

Apache poi中的HSSF和XSSF简述

excel主要分为两种格式:

  • xls是office2003以前的版本;兼容性较差;
  • xlsx 是2007版本的格式,兼容性好,也是主要的格式;

工作薄 WorkBook

这是创建或维护Excel工作簿的所有类的超接口。它属于
           org.apache.poi.ss.usermodel包。是实现此接口的两个类,

  • HSSFWorkbook : 这个类有读取和.xls 格式和写入Microsoft Excel文件的方法。它是在org.apache.poi.hssf.usermodel包的高层次的类。它实现了Workbook 接口
  • XSSFWorkbook : 这个类有读写Microsoft Excel和OpenOffice的XML文件的格式.xls或.xlsx的方法。它属于org.apache.xssf.usemodel包,并实现Workbook接口

工作表 Sheet

Sheet是在
           org.apache.poi.ss.usermodel包的接口,它是创建具有特定名称的高或低级别的电子表格的所有类的超接口。电子表格的最常见的类型是工作表,它被表示为单元的网格。

  • HSSFSheet: 这是在org.apache.poi.hssf.usermodel包的类。它可以创建Excel电子表格,它允许在sheet 方式和表数据格式。
  • XSSFSheet: 这是代表了Excel电子表格的高级别代表的一类。这在org.apache.poi.hssf.usermodel包下。

行 Row

这是在
           org.apache.poi.ss.usermodel包的接口。它是用于一排的电子表格的高层表示。


单元格 Cell

这是在
           org.apache.poi.ss.usermodel包的接口。它是代表了单元在电子表格中的行中的所有类的超接口。 单元格可以使用各种属性,例如空白,数字,日期,错误等单元格被添加到一个行之前应具有(基于0)自己的编号

Apache poi中的HSSF和XSSF文件导入具体实现

下面的代码根据考试系统项目中的导入文件模块,解析试题模板,将excel内容导入到数据库中,代码实现可能比较复杂但是能够让自己清晰的表现出来导入功能

 /**
 * 将excel表中的数据导入
 * @param fileName
 * @return
 */
 public List> readTimeTableXml(String fileName) {
 //判断是否是excel2007格式
 boolean isE2007 = false;
 int totalNum = 0;
 List> listMaps= Lists.newArrayList();
 Mapmap = Maps.newHashMap();
 if (fileName.endsWith("xlsx")) isE2007 = true;
 try {
 InputStream input = new FileInputStream(fileName);
 //创建工作薄对象
 Workbook wb = null;
 //根据文件格式(2003或者2007)来初始化
 if (isE2007){
 wb = new XSSFWorkbook(input);
 } else{
 wb = new HSSFWorkbook(input);
 }
 Listlist = Lists.newArrayList();
 //遍历某一单元
 for(int s = 0;s<2;s  ){
 //创建工作表对象
 Sheet sheet = wb.getSheetAt(s);
 //遍历每一行
 for(int rowNum = 1;rowNum <= sheet.getLastRowNum();rowNum  ){
 //获取行
 Row row = sheet.getRow(rowNum);
 if(row != null){
 Questions q = new Questions();
 Integer type = s 1;//试题类型
 String name = row.getCell(0).toString();//题干
 String standardAnswer = row.getCell(5).toString();//正确答案
 String analysis = row.getCell(6).toString();//解析
 String difficulty = row.getCell(8).toString();//试题难度
 Integer dy =1;
 if(difficulty.equals("简单")){
 dy = 1;
 }else if (difficulty.equals("普通")){
 dy = 2;
 }else if (difficulty.equals("困难")){
 dy = 3;
 }else if(difficulty.equals("极难")){
 dy = 4;
 }
 Map[] options = new Map[4];//试题选项
 for(int i =0;i<4;i  ){
 options[i] = Maps.newHashMap();
 options[i].put("option",(char)(65 i) "、" row.getCell(i 1).toString());
 }
 //插入数据
 q.setTypeId(type);
 q.setName(name);
 q.setDifficulty(dy);
 q.setStandardAnswer(standardAnswer);
 q.setAnalysis(analysis);
 q.setOptions(JSONObject.toJSONString(options));
 q.setTypeCode(s==0? "single" : "multiSelect");
 //添加到集合中
 list.add(q);
 }
 if(totalNum <= 0){
 MapmaperroNumTwo= Maps.newHashMap();
 maperroNumTwo.put("erroNum",row.getCell(0).toString());
 listMaps.add(maperroNumTwo);
 }
 }
 questionsMapper.batchImport(list);//批量导入数据
 } catch (IOException e) {
 e.printStackTrace();
 }
 return listMaps;//返回错误信息
 }

   

总之在使用POI导入的时候,注意重要一点就是区分行和列,一般情况先遍历行再取该行中的每一列数据。

如有不足之处,欢迎留言,需要demo可以私信我,让我们共同进步。如果你觉得有阅读和收藏价值,请关注本人,编程之家,每天为你分享编程相关知识。

       

关注我,每天更新

(0)

相关推荐