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)