关于POI中excel取值问题

/**POIExcel文件单元格的类型

在读取每一个单元格的值的时候,通过getCellType方法获得当前单元格的类型,在Excel中单元格有6种类型,如下所示。

1CELL_TYPE_BLANK:空值

2CELL_TYPE_BOOLEAN:布尔型

3CELL_TYPE_ERROR: 错误

4CELL_TYPE_FORMULA:公式型一般模板中没有

5CELL_TYPE_STRING:字符串型

6CELL_TYPE_NUMERIC:数值型

如果单元格的TypeCELL_TYPE_NUMERIC时,还需要进一步判断该单元格的数据格式,因为它有可能是Date类型,在Excel中的Date类型也是以Double类型的数字存储的。Excel中的Date表示当前时间与190011日相隔的天数,所以需要调用HSSFDateUtilisCellDateFormatted方法,判断该单元格的数据格式是否是Excel Date类型。如果是,则调用getDateCellValue方法,返回一个Java类型的Date

 

因此读取Excel中单元格中的数据时,得判断单元格格式类型,这是我写的,参考一下:

 *

 */

private static String dogetCell(Cell cell) {
		String temp = "";
		if (cell == null) {
			return temp;
		}
		switch (cell.getCellType()) {
		case Cell.CELL_TYPE_STRING:
			return cell.getRichStringCellValue().getString();
		case Cell.CELL_TYPE_NUMERIC:
			if (DateUtil.isCellDateFormatted(cell)) {
				Date date = cell.getDateCellValue();
				DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
				temp = df.format(date);
			} else {
				return String.valueOf(cell.getNumericCellValue());
			}
		case Cell.CELL_TYPE_FORMULA:
			cell.setCellType(Cell.CELL_TYPE_STRING);
			return cell.getStringCellValue();

		default:
			return temp;
		}	}

系统中有的都是这么写的

 

建议改成先判断cell是什么类型的在取值




错误写法:此方法是有些系统中获取excel中日期然后进行日期格式转换的方法
public static String dateFromExcel(Cell cell,ActionErrors errors) throws ParseException{
		Date date = null;
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");	
		String retDate = "";//没有判断单元格格式直接取值,会报错
		if(cell.getStringCellValue().trim().equals("")){
			return null;
		}
		//是否日期格式
		if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC||cell.getCellType() ==Cell.CELL_TYPE_FORMULA ){
			if(org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)){
				double d = cell.getNumericCellValue();
				date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(d);
			}
		}else{
			cell.setCellType(Cell.CELL_TYPE_STRING);
			retDate = cell.getStringCellValue().trim();
			String[] monthStr;
			if(retDate.indexOf("/")>0){	
				monthStr = retDate.split("/");
			}else{
				monthStr = retDate.split("-");
			}
			String year = monthStr[0];
			String month = monthStr[1];
			String day = monthStr[2];
			if (month.length() == 1) {
				month = "0" + month;								
			}
			if (day.length() == 1) {
				day = "0" + day;								
			}
			retDate = year + "-" + month+"-"+day;
			date = df.parse(retDate);
		}			
		df.setLenient(false);
		if(date == null){
			logger.debug("日期格式不正确");
			errors.add("save", new ActionError("message.failer", "日期格式不正确!"));
		}
		retDate = df.format(date);
		return retDate;
	}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李晓LOVE向阳

你的鼓励是我持续的不断动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值