常量 | 说明 | 取值 |
---|---|---|
Cell.CELL_TYPE_NUMERIC | 数值类型 | cellValue.getNumberValue() |
Cell.CELL_TYPE_STRING | 字符串类型 | cellValue.getStringValue() |
Cell.CELL_TYPE_BOOLEAN | 布尔类型 | cellValue.getBooleanValue() |
Cell.CELL_TYPE_FORMULA | 表达式类型 | 需要转换 |
Cell.CELL_TYPE_ERROR | 异常类型 | cellValue.getErrorCellValue() |
Cell.CELL_TYPE_BLANK | 空 |
1.遍历每一个cell,判断cell的类型
HSSF对应97-2003版本的Excel(文件扩展名为xls)
XSSF则对应2007版本的Excel (文件扩展名为xlsx)
类型不对,报错信息如下:
The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
testExcel.xls:
代码:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
public class test {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:Users/imall/Desktop/testExcel.xls");
Workbook wb = new HSSFWorkbook(fis);
Sheet sheet = wb.getSheetAt(0);
//处理单元格中是公式的情况
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
// getLastRowNum,获取最后一行的行标
//遍历所有行
for (int j = 0; j < sheet.getLastRowNum() + 1; j++) {
//获取一行
Row row = sheet.getRow(j);
if (row != null) {
// getLastCellNum,是获取最后一个不为空的列是第几个
for (int k = 0; k < row.getLastCellNum(); k++) {
// getCell 获取单元格数据
if (row.getCell(k) != null) {
switch (row.getCell(k).getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(row.getCell(k).getBooleanCellValue());
System.out.print(" ");
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.print(row.getCell(k).getNumericCellValue());
System.out.print(" ");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(row.getCell(k).getStringCellValue());
System.out.print(" ");
break;
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_ERROR:
System.out.print(row.getCell(k).getErrorCellValue());
System.out.print(" ");
break;
case Cell.CELL_TYPE_FORMULA:
System.out.print(evaluator.evaluate(row.getCell(k)).getNumberValue());
System.out.print(" ");
break;
}
}
}
}
System.out.println();
}
}
}
2.我们表格里面的编码,年龄,数量打印出来都是double类型,如果希望获得Integer类型需要进行如下操作:
1.表格只需要int类型的时候:
//可以强制规定该单元格的格式为String
row.getCell(k).setCellType(Cell.CELL_TYPE_STRING);//设置为String
String cell = row.getCell(k).getStringCellValue().trim();//得到值
int num = Integer.parseInt(cell);//转换
2.,如果int,double类型同时需要的时候(就要指定那个需要进行处理):
case Cell.CELL_TYPE_NUMERIC:
Number num = null;
if (k != 5) {
//可以强制规定该单元格的格式为String
row.getCell(k).setCellType(Cell.CELL_TYPE_STRING);//设置为String
String cell = row.getCell(k).getStringCellValue().trim();//得到值
num = Integer.parseInt(cell);//转换
} else {
num = row.getCell(k).getNumericCellValue();//转换
}
System.out.print(num);
System.out.print(" ");
break;
3.数量这一栏,一般来说,我们希望他上传的是数字,但是如果数量这一栏写了中文或者字母或其他字符,可以做如下处理:(怎么确保单元格里面的是数字)
(在switch case 后做数字验证,因为要转换为string类型作验证,为避免对数据原来的类型产生影响,放在case后验证)
单元格类型为Cell.NUMeric想修改成 CELL_TYPE_STRING是不会报错的
但是单元格类型为Cell.CELL_TYPE_STRING 想修改成 NUMericcell.setCellType(cell.CELL_TYPE_NUMERIC);
执行上面的一行就报如下错误
java.lang.IllegalStateException: Cannot get a numeric value from a text cell
case之后加上这个代码:
if (j != 0 && k == 5) {
//先把目标对象转换为string类型,然后验证是否是数字
row.getCell(k).setCellType(XSSFCell.CELL_TYPE_STRING);
String stringCellValue = row.getCell(k).getStringCellValue();
//判断对否是小数或者整数,包含正负数
if (!stringCellValue.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$")) {
throw new Exception();
}
}
其实可以更简单:在case前判断一下是否是CELL_TYPE_NUMERIC就好了
if (row != null) {
// getLastCellNum,是获取最后一个不为空的列是第几个
for (int k = 0; k < row.getLastCellNum(); k++) {
if (j != 0 && k == 5) {
if (XSSFCell.CELL_TYPE_STRING == row.getCell(k).getCellType()) {
throw new Exception();
}
}
// getCell 获取单元格数据
if (row.getCell(k) != null) {
4.完整测试代码
package huanmingjie.fengmingmen.test;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import java.io.FileInputStream;
public class test {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("C:Users/imall/Desktop/testExcel.xls");
Workbook wb = new HSSFWorkbook(fis);
Sheet sheet = wb.getSheetAt(0);
//处理单元格中是公式的情况
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
// getLastRowNum,获取最后一行的行标
//遍历所有行
for (int j = 0; j < sheet.getLastRowNum() + 1; j++) {
//获取一行
Row row = sheet.getRow(j);
if (row != null) {
// getLastCellNum,是获取最后一个不为空的列是第几个
for (int k = 0; k < row.getLastCellNum(); k++) {
if (j != 0 && k == 5) {
if (XSSFCell.CELL_TYPE_STRING == row.getCell(k).getCellType()) {
throw new Exception();
}
}
// getCell 获取单元格数据
if (row.getCell(k) != null) {
switch (row.getCell(k).getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(row.getCell(k).getBooleanCellValue());
System.out.print(" ");
break;
case Cell.CELL_TYPE_NUMERIC:
Number num = null;
if (k != 5) {
//可以强制规定该单元格的格式为String
row.getCell(k).setCellType(Cell.CELL_TYPE_STRING);//设置为String
String cell = row.getCell(k).getStringCellValue().trim();//得到值
num = Integer.parseInt(cell);//转换
} else {
num = row.getCell(k).getNumericCellValue();//转换
}
System.out.print(num);
System.out.print(" ");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(row.getCell(k).getStringCellValue());
System.out.print(" ");
break;
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_ERROR:
System.out.print(row.getCell(k).getErrorCellValue());
System.out.print(" ");
break;
case Cell.CELL_TYPE_FORMULA:
System.out.print(evaluator.evaluate(row.getCell(k)).getNumberValue());
System.out.print(" ");
break;
}
}
}
}
System.out.println();
}
}
}