先说一些方法
在Apache POI库中,CellType.STRING
是用于定义Excel单元格数据类型的一个枚举值。Apache POI是一个流行的Java库,用于处理Microsoft Office文档,特别是Excel文件(如.xls和.xlsx格式)。CellType
枚举定义了单元格可以持有的不同类型的数据,这些类型包括:
STRING
:表示单元格包含文本字符串。NUMERIC
:表示单元格包含数字(无论是整数、浮点数还是日期时间值)。FORMULA
:表示单元格包含一个公式。BLANK
:表示单元格为空(但不同于null
,因为它仍然是一个单元格,只是没有值)。BOOLEAN
:表示单元格包含布尔值(true或false)。ERROR
:表示单元格包含错误(如#DIV/0!)。
-
getCell(0)
:这部分代码从当前行(Row
对象)中获取索引为0的单元格(Cell
对象)。在Excel中,索引通常是从0开始的,所以getCell(0)
获取的是第一列的第一个单元格。 -
.getStringCellValue()
:这部分代码是调用Cell
对象上的一个方法,用于获取单元格中的字符串值。然而,重要的是要注意,在调用.getStringCellValue()
之前,你应该确认单元格的类型确实是CellType.STRING
,否则可能会遇到IllegalStateException
。这是因为Apache POI要求你以正确的方式访问单元格的数据,即你需要根据单元格的实际类型来调用相应的方法来获取其值。
如果单元格不是字符串类型,但你却调用了.getStringCellValue()
,Apache POI会尝试将单元格的内容转换为字符串(如果可能的话),但这并不总是你想要的,特别是当单元格实际上包含数字、日期或公式时。对于非字符串类型的单元格,你应该使用以下方法之一来获取其值:
- 对于数字类型,使用
.getNumericCellValue()
。 - 对于日期时间类型(在Excel中存储为数字),你可能需要先使用
.getDateCellValue()
(但注意这可能会返回Java的Date
对象,这在处理Excel日期时可能不是最理想的方式),或者更常见的是,使用.getNumericCellValue()
结合DateUtil
类来解析日期。 - 对于布尔类型,使用
.getBooleanCellValue()
。 - 对于公式类型,如果你想要公式的结果(而不是公式本身),你需要先评估公式(这通常涉及到更复杂的操作),但如果你只是想要公式作为字符串,你可以使用
.getCellFormula()
。
如果你不确定单元格的类型,可以先调用.getCellType()
来检查它,然后根据类型调用相应的方法来获取值。此外,Apache POI还提供了一种便捷的方法.getRichStringCellValue()
,它可以处理包含富文本(如不同字体或颜色)的单元格,但请注意,这仍然要求单元格本质上是字符串类型或可以转换为字符串。
eg:
先用HSSFWorkbook读取excel文件内容,这里假设是.xls文件
dyx = new HSSFWorkbook(file.getInputStream());
读取第一个(工作单)sheet的数据
HSSFSheet sheet = dyx.getSheetAt(0);
初始化一个实体类集合,用于存储excel的内容
List<dyxOptionDO> importDatas = new ArrayList<>();
循环sheet页中数据从第二行开始,假设第一行是标题
HSSFRow row = null; for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { //获取每一行数据 row = sheet.getRow(i);
//在循环体内,首先检查每一行的每个关键单元格是否为空,并据此抛出GenericException异常:
if (row.getCell(0) == null) { throw new GenericException("dict_code不能为空!"); } if (row.getCell(1) == null) { throw new GenericException("option_value不能为空!"); } if (row.getCell(2) == null) { throw new GenericException("option_name不能为空!"); } if (row.getCell(9) == null) { throw new GenericException("create_user不能为空!"); } //创建对象,准备为该对象设置参数 dyxOptionDO data = new dyxOptionDO(); row.getCell(0).setCellType(CellType.STRING); row.getCell(1).setCellType(CellType.STRING); row.getCell(2).setCellType(CellType.STRING); if (row.getCell(5) != null) { row.getCell(5).setCellType(CellType.STRING); } if (row.getCell(6) != null) { row.getCell(6).setCellType(CellType.STRING); } if (row.getCell(7) != null) { row.getCell(7).setCellType(CellType.STRING); } if (row.getCell(8) != null) { row.getCell(8).setCellType(CellType.STRING); } if (row.getCell(9) != null) { row.getCell(9).setCellType(CellType.STRING); } if (row.getCell(10) != null) { row.getCell(10).setCellType(CellType.STRING); } if (row.getCell(13) != null) { row.getCell(13).setCellType(CellType.STRING); } if (row.getCell(14) != null) { row.getCell(14).setCellType(CellType.STRING); } if (row.getCell(3) != null) { row.getCell(3).setCellType(CellType.NUMERIC); } if (row.getCell(4) != null) { row.getCell(4).setCellType(CellType.NUMERIC); } if (row.getCell(11) != null) { row.getCell(11).setCellType(CellType.NUMERIC); } if (row.getCell(12) != null) { row.getCell(12).setCellType(CellType.NUMERIC); } data.setDictCode(row.getCell(0).getStringCellValue()); data.setOptionValue(row.getCell(1).getStringCellValue()); data.setOptionName(row.getCell(2).getStringCellValue()); data.setOptionParentId(row.getCell(3) == null ? null : Integer.valueOf((int) row.getCell(3).getNumericCellValue())); data.setOptionIndex(row.getCell(4) == null ? null : Integer.valueOf((int) row.getCell(4).getNumericCellValue())); data.setOptionNameEn(row.getCell(5) == null ? null : row.getCell(5).getStringCellValue()); data.setOptionNameExtend(row.getCell(6) == null ? null : row.getCell(6).getStringCellValue()); data.setOptionValueExtend(row.getCell(7) == null ? null : row.getCell(7).getStringCellValue()); data.setOptionIndexExtend(row.getCell(8) == null ? null : row.getCell(8).getStringCellValue()); data.setCreateUser(row.getCell(9) == null ? null : row.getCell(9).getStringCellValue()); data.setUpdateUser(row.getCell(10) == null ? null : row.getCell(10).getStringCellValue()); data.setIsDelete(row.getCell(11) == null ? null : Byte.valueOf((byte) row.getCell(11).getNumericCellValue())); data.setParentId(row.getCell(12) == null ? null : Integer.valueOf((int) row.getCell(12).getNumericCellValue())); data.setParentCode(row.getCell(13) == null ? null : row.getCell(13).getStringCellValue()); data.setParentValue(row.getCell(14) == null ? null : row.getCell(14).getStringCellValue()); importDatas.add(data); } //循环校验并存入数据库 for (dyxOptionDO imdata : importDatas) { dyxMapper.insertSelective(imdata); }
}