POI读取Excel:对数据类型的一些问题处理

常量 说明 取值
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:
POI读取Excel:对数据类型的一些问题处理_第1张图片

代码:

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();
        }
    }
}

POI读取Excel:对数据类型的一些问题处理_第2张图片

2.我们表格里面的编码,年龄,数量打印出来都是double类型,如果希望获得Integer类型需要进行如下操作:

1.表格只需要int类型的时候:
POI读取Excel:对数据类型的一些问题处理_第3张图片

//可以强制规定该单元格的格式为String
row.getCell(k).setCellType(Cell.CELL_TYPE_STRING);//设置为String
String cell = row.getCell(k).getStringCellValue().trim();//得到值
int num = Integer.parseInt(cell);//转换

POI读取Excel:对数据类型的一些问题处理_第4张图片
2.,如果int,double类型同时需要的时候(就要指定那个需要进行处理):
POI读取Excel:对数据类型的一些问题处理_第5张图片

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;

POI读取Excel:对数据类型的一些问题处理_第6张图片

3.数量这一栏,一般来说,我们希望他上传的是数字,但是如果数量这一栏写了中文或者字母或其他字符,可以做如下处理:(怎么确保单元格里面的是数字)

(在switch case 后做数字验证,因为要转换为string类型作验证,为避免对数据原来的类型产生影响,放在case后验证)

单元格类型为Cell.NUMeric想修改成 CELL_TYPE_STRING是不会报错的
但是单元格类型为Cell.CELL_TYPE_STRING 想修改成 NUMeric

cell.setCellType(cell.CELL_TYPE_NUMERIC);
执行上面的一行就报如下错误
java.lang.IllegalStateException: Cannot get a numeric value from a text cell

POI读取Excel:对数据类型的一些问题处理_第7张图片
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();
  	  }
}

POI读取Excel:对数据类型的一些问题处理_第8张图片

其实可以更简单:在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) {

POI读取Excel:对数据类型的一些问题处理_第9张图片

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();
        }
    }
}

你可能感兴趣的:(SSM项目,导出Excel)