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:
在这里插入图片描述

代码:

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 想修改成 NUMeric

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Apache POI库来读取Excel数据并提取图片。以下是一个简单的示例代码: ```java import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFPicture; import org.apache.poi.xssf.usermodel.XSSFPictureData; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadExcelWithImage { public static void main(String[] args) throws IOException { String filePath = "path/to/excel/file.xlsx"; InputStream inputStream = new FileInputStream(filePath); Workbook workbook = WorkbookFactory.create(inputStream); int sheetCount = workbook.getNumberOfSheets(); for (int i = 0; i < sheetCount; i++) { Sheet sheet = workbook.getSheetAt(i); if (sheet instanceof XSSFSheet) { XSSFSheet xssfSheet = (XSSFSheet) sheet; for (Row row : xssfSheet) { for (Cell cell : row) { switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; case FORMULA: System.out.print(cell.getCellFormula() + "\t"); break; default: System.out.print(" " + "\t"); } if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { switch (cell.getCachedFormulaResultType()) { case Cell.CELL_TYPE_NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case Cell.CELL_TYPE_STRING: System.out.print(cell.getStringCellValue() + "\t"); break; } } if (cell.getCellType() == Cell.CELL_TYPE_BLANK) { System.out.print(" " + "\t"); } if (cell.getCellType() == Cell.CELL_TYPE_ERROR) { System.out.print(cell.getErrorCellValue() + "\t"); } if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { System.out.print(cell.getBooleanCellValue() + "\t"); } if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { System.out.print(cell.getNumericCellValue() + "\t"); } if (cell.getCellType() == Cell.CELL_TYPE_STRING) { System.out.print(cell.getStringCellValue() + "\t"); } if (cell.getCellType() == Cell.CELL_TYPE_BLANK) { System.out.print("" + "\t"); } if (cell.getCellType() == Cell.CELL_TYPE_FORMULA && cell.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC) { System.out.print(cell.getNumericCellValue() + "\t"); } if (cell.getCellType() == Cell.CELL_TYPE_FORMULA && cell.getCachedFormulaResultType() == Cell.CELL_TYPE_STRING) { System.out.print(cell.getStringCellValue() + "\t"); } // get image from cell if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { if (xssfSheet.getDrawingPatriarch() != null) { for (XSSFPicture picture : xssfSheet.getDrawingPatriarch().getShapes().getPictures()) { XSSFClientAnchor anchor = picture.getClientAnchor(); if (anchor.getRow1() == row.getRowNum() && anchor.getCol1() == cell.getColumnIndex()) { XSSFPictureData pictureData = picture.getPictureData(); byte[] bytes = pictureData.getData(); String extension = pictureData.suggestFileExtension(); String fileName = "image" + row.getRowNum() + "_" + cell.getColumnIndex() + "." + extension; IOUtils.write(bytes, new FileOutputStream(fileName)); } } } } } System.out.println(""); } } } } } ``` 在这个例子中,我们遍历每个单元格,并根据其类型打印出其内容。如果单元格包含图片,我们使用Apache POIXSSFDrawing对象来提取图像并将其保存到文件中。 请注意,上面的代码仅适用于XLSX格式的Excel文件。如果您的Excel文件是旧的XLS格式,您需要使用HSSFWorkbook和HSSFPicture类来读取图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值