JAVA POI 在解析Excel 单元格为数字的常见问题及处理办法

一. 单元格为数字 Cell cell = row.getCell(int t) 的返回值 为 xx.0 的问题处理

由于数据库中定义的是varchar 类型 xx.0 的数据 会影响业务的逻辑

1.第一种办法,获取值的时候转换类型
	double  tcell  = cell.getNumericCellValue();
	再把double 转成你需要的格式
2.第二种办法 使用 NumberFormat (DecimalFormat) 来处理数据
String result = new String();
double value = cell.getNumericCellValue();
DecimalFormat format = new DecimalFormat();
result = format.format(value);
PS:这里需要注意  如果传的数值是 科学计数法的 科学计数法的数字就转换成了带逗号的,
例如:12345678912345的科学计数法是1.23457E+13,经过这个格式化后就变成了字符串“12,345,678,912,345”,
 或者是这个数值本身比较大, 在EXCEL中显示的时候是 
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019112520375737.png) 这也并不是想要的结果
所以 我们需要 进行一下数据的处理

if(result!=null && result.indexOf(",")>=0){
	result = result.replaceAll(",","");
}
这样就达到预期的结果了
二.有关时间格式的数据处理 (拷用了前辈的方法)
我把它和数字的处理合成了一个方法.
/**
	 * 	判断单元格的内容 属于什么类型的数据 相应进行转换
	 * @param cell 数据对象
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static Object getCellFormatValue(Cell cell) {
		Object cellValue = null;
		if (cell != null) {
			// 判断cell类型
			switch (cell.getCellType()) {
			
			case Cell.CELL_TYPE_NUMERIC: // 数字
				cellValue = stringDateProcess(cell);
				break;
			case Cell.CELL_TYPE_STRING: // 字符串
				cellValue = String.valueOf(cell.getStringCellValue());
				break;
			case Cell.CELL_TYPE_BOOLEAN: // Boolean
				cellValue = String.valueOf(cell.getBooleanCellValue());
				break;
			case Cell.CELL_TYPE_FORMULA: // 公式
				cellValue = String.valueOf(cell.getCellFormula());
				break;
			case Cell.CELL_TYPE_BLANK: // 空值
				cellValue = cell.getStringCellValue();
				break;
			case Cell.CELL_TYPE_ERROR: // 异常
				cellValue = "非法字符";
				break;
			default:
				cellValue = cell;
				break;
			}
		} else {
			cellValue = "";
		}
		return cellValue;
	}
/**
	 * 	解析Excel日期格式转换方法
	 * @param cell 数据对象
	 * @return
	 */
	public static String stringDateProcess(Cell cell) {
		String result = new String();
		if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
			SimpleDateFormat sdf = null;
			if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
				sdf = new SimpleDateFormat("HH:mm");
			} else {// 日期
				sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			}
			Date date = cell.getDateCellValue();
			result = sdf.format(date);
		} else if (cell.getCellStyle().getDataFormat() == 58) {
			// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			double value = cell.getNumericCellValue();
			Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
			result = sdf.format(date);
		} else {
			double value = cell.getNumericCellValue();
			CellStyle style = cell.getCellStyle();
			DecimalFormat format = new DecimalFormat();
			String temp = style.getDataFormatString();
			// 单元格设置成常规
			if (temp.equals("General")) {
				format.applyPattern("#");
			}
			result = format.format(value);
			if (result!=null && result.indexOf(",")>=0) {
				result = result.replaceAll(",","");
			}
			
			
		}
		return result;
	}

补充: 在实现完成之后,还遇到一个这样的问题. 如果给的数据小数位过长DecimalFormat 只会保留3位小数. 下面给出处理办法

	0和#都是占位符,但在不同的地方,作用不一样。下面对他们做了具体的比较。
	希望对大家有所帮助。
	0: 
	    比实际数字的位数多,不足的地方用0补上。
	    new DecimalFormat("00.00").format(3.14)  //结果:03.14
	    new DecimalFormat("0.000").format(3.14)  //结果: 3.140
	    new DecimalFormat("00.000").format(3.14)  //结果:03.140
	    比实际数字的位数少:整数部分不改动,小数部分,四舍五入
	    new DecimalFormat("0.000").format(13.146)  //结果:13.146
	    new DecimalFormat("00.00").format(13.146)  //结果:13.15
	    new DecimalFormat("0.00").format(13.146)  //结果:13.15
	#: 
		 **比实际数字的位数多,不变。**
	    new DecimalFormat("##.##").format(3.14)  //结果:3.14
	    new DecimalFormat("#.###").format(3.14)  //结果: 3.14
	    new DecimalFormat("##.###").format(3.14)  //结果:3.14
	    比实际数字的位数少:整数部分不改动,小数部分,四舍五入
	    new DecimalFormat("#.###").format(13.146)  //结果:13.146
	    new DecimalFormat("##.##").format(13.146)  //结果:13.15
	    new DecimalFormat("#.##").format(13.146)  //结果:13.15
    ```
    EX: DecimalFormat format = new DecimalFormat("#.##########");   ####代表你要保留的几位小数, 
    根据自己业务情况而定.
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Apache POI解析Excel文件的Java示例: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; 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; public class ExcelParser { public static void main(String[] args) { try { //打开Excel文件 FileInputStream file = new FileInputStream(new File("example.xlsx")); Workbook workbook = WorkbookFactory.create(file); //获取第一个工作表 Sheet sheet = workbook.getSheetAt(0); //迭代每一行 for (Row row : sheet) { //迭代每一列 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; default: System.out.print("\t"); } } System.out.println(); } //关闭文件 file.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在这个例子,我们首先打开一个Excel文件,然后获取第一个工作表。接下来,我们迭代每一行和每一列,并根据单元格类型打印出每个单元格的内容。最后,我们关闭文件。 这只是一个简单的示例,实际上您可以使用POI库读取和写入Excel文件的各个部分,包括单元格样式和公式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值