一:先在E盘准备两个excel,后缀名分别是xls,xlsx。
二:看一下两个excel里分面有什么内容。
1.xlsx中含有sheet1和sheet2。
sheet1中有三条记录,并且在表头上方有一个“说明”单元格,当然这个说明的内容不是我们需要的,在程序中需要过虑掉,第五行无数据,在程序中也是需要过滤掉的。
sheet2中有2条记录,“第二中学”的这行记录中,姓名这一列没有内容,这一行数据不完整,程序也是需要过滤掉这行记录的。
2.xls文件中含有sheet1和sheet2。
sheet1中有三条记录,里面排版样式和1.xlsx一致,不多说了。。。。
sheet2中没有任何记录
下面开始写程序:
package utils;
import java.io.File;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil {
public static void main(String[] args) {
File file = new File("E:/1.xlsx");
// File file = new File("E:/2.xls");
try {
List<List> list = importExcel(file);
System.out.println();
System.out.println("---------------------分隔---------------------");
System.out.println();
System.out.println(list);
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<List> importExcel(File file) throws Exception {
Workbook wb = null;
String fileName = file.getName();// 读取上传文件(excel)的名字,含后缀后
// 根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
Iterator<Sheet> sheets = null;
List<List> returnlist = new ArrayList<List>();
try {
if (fileName.endsWith("xls")) {
wb = new HSSFWorkbook(new FileInputStream(file));
sheets = wb.iterator();
} else if (fileName.endsWith("xlsx")) {
wb = new XSSFWorkbook(new FileInputStream(file));
sheets = wb.iterator();
}
if (sheets == null) {
throw new Exception("excel中不含有sheet工作表");
}
// 遍历excel里每个sheet的数据。
while (sheets.hasNext()) {
System.out.println("-----遍历sheet-----");
Sheet sheet = sheets.next();
List<Map> list = getCellValue(sheet);
System.out.println(list);
returnlist.add(list);
}
} catch (Exception ex) {
throw ex;
} finally {
if (wb != null) wb.close();
}
return returnlist;
}
// 获取每一个Sheet工作表中的数。
private static List<Map> getCellValue(Sheet sheet) {
List<Map> list = new ArrayList<Map>();
// sheet.getPhysicalNumberOfRows():获取的是物理行数,也就是不包括那些空行(隔行)的情况
for (int i = sheet.getFirstRowNum(); i < sheet.getPhysicalNumberOfRows(); i++) {
Map map = new HashMap<>();
// 获得第i行对象
Row row = sheet.getRow(i);
if (row == null) {
continue;
} else {
// getLastCellNum:获取列数(比最后一列列标大1)
// 通常导入的excel是符合需求规范的,这里因为我们准备的excel列数是7列,如果小于7列说明传入的excel文件有问题。
if (row.getLastCellNum() < 7) {
continue;
}
int j = row.getFirstCellNum();// 获取第i行第一个单元格的下标
// 学校名称这一列必然是字符串,所有直接使用getStringCellValue()获取单元格内容
String schoolName = row.getCell(j++).getStringCellValue();// 学校
if (StringUtils.isEmpty(schoolName)) {
continue;
}
map.put("schoolName", schoolName);
String name = row.getCell(j++).getStringCellValue();// 姓名
if (StringUtils.isEmpty(name)) {
continue;
}
map.put("name", name);
Cell cell = row.getCell(j++);// 学号(在excel中,学号可能是纯数字,也可能是字母在数字)
if (cell.getCellTypeEnum().equals(CellType.STRING)) {// 如果是字符串,直接获取值
map.put("sn", cell.getStringCellValue());
} else if (cell.getCellTypeEnum().equals(CellType.NUMERIC)) {
// 如果excel中学号是纯数字,获取的值是数值类型,再toPlainString()转为字符类型,因为数据库中学号字段需要是字符类型。
map.put("sn", new BigDecimal(cell.getNumericCellValue()).toPlainString());
}
cell = row.getCell(j++);// 年级(数据库中,年级是int类型,所以这里我们转换为int)
if (cell.getCellTypeEnum().equals(CellType.STRING)) {
try {
String gradeStr = cell.getStringCellValue();
//
int grade = Integer.parseInt(gradeStr);
map.put("grade", grade);
} catch (Exception e) {
continue;
}
} else if (cell.getCellTypeEnum().equals(CellType.NUMERIC)) {
map.put("grade", (int) cell.getNumericCellValue());
}
cell = row.getCell(j++);// 班级(数据库中,年级是int类型,所以这里我们转换为int)
if (cell.getCellTypeEnum().equals(CellType.STRING)) {
try {
String klassStr = cell.getStringCellValue();
int klass = Integer.parseInt(klassStr);
map.put("klass", klass);
} catch (Exception e) {
continue;
}
} else {
map.put("klass", (int) cell.getNumericCellValue());
}
String genderStr = row.getCell(j++).getStringCellValue();
int gender = "男".equals(genderStr) ? 1 : "女".equals(genderStr) ? 0 : 2;
map.put("gender", gender);
if (j <= row.getLastCellNum()) {
cell = row.getCell(j++);// 手机号
if (cell.getCellTypeEnum().equals(CellType.STRING))
map.put("phone", cell.getStringCellValue());
else if (cell.getCellTypeEnum().equals(CellType.NUMERIC)) map.put("phone",
new BigDecimal(cell.getNumericCellValue()).toPlainString());
}
list.add(map);
}
}
return list;
}
}
先导入1.xlsx,从控制台可以看出:
sheet1中的三条记录都读取到了,sheet2中虽然有两行记录,但程序中做了判断,如果学校或者姓名这两列如果为空,那认为这行记录是不完整的,未加入到list里面。
导入2.xls,从控制台可以看出:
sheet1中的三条记录都读取到了,sheet2中没有数据,所有list中为空