一般基于POI导入时仅需要一个POI包即可,但是前提是所需要导入的模板或文件仅需要支持一个excel版本时,这时你仅需要导入一个POI包即可。
ooxml、ooxml-schemas是基于xlsx后缀也就是office版本在2003以后的版本时所需要的包。
目前所写的excel导入的版本为 office 2003 版本后缀名为 .xls 的导入方式,如果需要更高版本的将里面的 new HSSFWorkbook 这块进行变更为对应版本的即可。
HSSFworkbook 支持后缀.xls(2003) XSSFworkbook支持 .xlsx(2007)
而SXSSFWorkbook 则是在数据量一个sheet表中超出65536数据后对excel操作所需用到的。
首先说单元格中数据校验:POI5.0对CellType进行了更新(目前已知的,不知道从哪个版本开始更新的了,反正3.7的时候肯定不是这么写,3.7时写法是:Cell.CELL_TYPE_NUMERIC 引用类型),所以只要导入了CellType类即可用以下写法进行编写。
public static String getCellValue(Cell cell) {
String cellValue = "";
if (cell == null) {
return cellValue;
}
// 把数字当成String来读,避免出现1读成1.0的情况
if (cell.getCellType() == NUMERIC) {
cell.setCellType(STRING);
}
// 判断数据的类型
switch (cell.getCellType()) {
case NUMERIC: // 数字
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case STRING: // 字符串
cellValue = String.valueOf(cell.getStringCellValue()).trim();
break;
case BOOLEAN: // Boolean
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case FORMULA: // 公式
cellValue = String.valueOf(cell.getCellFormula());
break;
case BLANK: // 空值
cellValue = "";
break;
case ERROR: // 故障
cellValue = "非法字符";
break;
default:
cellValue = "未知类型";
break;
}
return cellValue;
}
解析导入:
//解析表格,根据版本选择此处 new的workbook
Workbook workbook = new HSSFWorkbook(file.getInputStream());
//获取当前sheet表格数量
int numberOfSheets = workbook.getNumberOfSheets();
//循环所有的sheet表格
for (int i = 0; i < numberOfSheets; i++) {
// 获得当前sheet工作表
Sheet sheet = workbook.getSheetAt(i);
// 获得当前sheet的开始行
int firstRowNum = sheet.getFirstRowNum();
// 获得当前sheet的结束行
int lastRowNum = sheet.getLastRowNum();
Row row;
//取第一行的标题
row = sheet.getRow(0);
String[] title = new String[row.getLastCellNum()];
for (int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j);
title[j] = POICellType.getCellValue(cell);
}
// 循环除了前一行的所有行
for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) {
// 获得当前行
row = sheet.getRow(rowNum);
if (row != null) {
StringBuffer desc= new StringBuffer();
for (int k = 0; k < row.getLastCellNum(); k++) {
Cell cell = row.getCell(k);
desc.append(title[k] + ":" + POICellType.getCellValue(cell) + ",");
}
System.out.println(desc);
}
}
}
注:发起请求的时候有的会需要 commons-math3-3.6.1.jar 的包,看具体报错情况。