使用HSSF、XSSH操作Excel数据时遇到的一些问题

1、需要导入的JAR问题:

必须要用的包:

poi-xxx.jar
poi-ooxml-xxx.jar

poi-ooxml-schemas-xxx.jar
xmlbeans-xxx.jar.jar

dom4j-1.6.1.jar

poi-scratchpad-xxx.jar

geronimo-stax-api_1.0_spec-1.0

 

可能用到的:

poi-examples-3.8.jar
poi-excelant-3.8.jar

还有那一大堆common的包。

我目前用的POI是3.8的。

必须用的是因为我的项目里面有引入,后面两个JAR在应用里面起不起作用我没有测试过,只是引入过。

可能用到的这些JAR因为在系统里面没有引用,但是网上有些说需要引入。

 

2、异常:java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTFileVersion

需要的包都引入之后可以解决很多乱七八糟的问题,但是也可能出现这个个异常:java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTFileVersion。

具体表现是这样子的:

我在一个try/catch/finally结构的try里面写:

XSSFWorkbook workbook = new XSSFWorkbook();

System.out.println("***************************");

执行new XSSFWorkbook()这句的时候,直接跳到finally里面去了,不执行System.out,也不进入catch,直接进入finally,但是控制台报异常:java.lang.IllegalStateException: Cannot reset buffer after response has been committed。这个异常很常见,无非就是各种stream的flush,close问题导致的,问题是我这还没有牵涉到流呢,怎么会有这个呢。瞎报错。网上查资料,折腾了好久,一直这样子,后来把catch里面的Exception改成了Throwable,再一执行,哈哈,果然进来了。报错:java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTFileVersion。网上查资料说这个异常是因为poi-ooxml-schemas-xxx.jar导致的,得换成ooxml-schemas-1.1.jar。ooxml-schemas-1.1.jar不知道去哪里下,百度找到的都得花钱买,MD。买了替换了问题解决啦。这个jar包我也上传了,有需要的可以下。

 

3、异常:

a、org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]

b、org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: xxx

这两个异常基本都是版本没用对造成的,HXXF只能处理2003的,XSSF只能处理2007的,要是用错了就会报InvalidOperationException错。

 

4、Excel单元格数据类型的处理问题:

使用HSSF、XSSF读取Excel单元格里面的数据的时候,可能会因为数据格式报错,譬如Excel里面是数字类型的,代码用toString()一转,就报“数字不能转换成字符串”的错误啦,譬如时间类型的问题。这个在网上查了很多资料,根据碰到的问题,总结了一个比较全的:

private String parseExcel(Cell cell) {
	String result = new String();
	switch (cell.getCellType()) {
	case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型
		 short format = cell.getCellStyle().getDataFormat();  
		    SimpleDateFormat sdf = null;  
		    if(format == 14 || format == 31 || format == 57 || format == 58){ //日期    
		        sdf = new SimpleDateFormat("yyyy-MM-dd");  
		    }else if (format == 20 || format == 32) { //时间   
		        sdf = new SimpleDateFormat("HH:mm");  
		    }
		  //若为数字,获取到的Value会自动添加一个0,变成xxx.0,这种格式的数据不能保存到数据类型为int的字段中
		    Double value = cell.getNumericCellValue(); 
		    if(sdf!=null){//需要进行格式化
		    	Date date = HSSFDateUtil.getJavaDate(value);  
			    result = sdf.format(date);
		    }else{//可能是数字
		    	Long longVal = Math.round(value);//转换成long类型,此时没有小数点
//			    	System.out.println(longVal+"\t"+Double.parseDouble(longVal + ".0"));
		        if(Double.parseDouble(longVal + ".0") == value)  
		        	result = longVal.toString();  
		        else  
		        	result = value.toString();    
		    }
		break;
	case HSSFCell.CELL_TYPE_STRING:// String类型
		result = cell.getRichStringCellValue().toString();
		break;
	case HSSFCell.CELL_TYPE_BLANK:
		result = "";
	default:
		result = "";
		break;
	}
	return result;
}

上面的代码主要参考了两个人的代码, 具体链接找不到了,找到了再补上,有谁知到的可以给我留个言。

上面的代码说了一个问题:通过Double value = cell.getNumericCellValue();获取到的Value会自动添加一个0,变成xxx.0,这种格式的数据不能保存到数据类型为int的字段中。因此下面加了处理的代码:

Long longVal = Math.round(value);//转换成long类型,此时没有小数点
//System.out.println(longVal+"\t"+Double.parseDouble(longVal + ".0"));
if(Double.parseDouble(longVal + ".0") == value)  
	result = longVal.toString();  
else  
	result = value.toString();

 

4、new FileOutputStrea处理文件问题:

可能这不是一个问题,但是对于像我这种对流不是很清楚的人来说,还真是一个问题。通过

 

FileOutputStream fout = new FileOutputStream(filePath);

是可以新建文件的。要是给定的文件不存在,它就会自动创建,要是存在就直接使用。这个情况是真的不知道,所以每次都傻傻的先手动新建一个。

 

5、Excel无法打开问题:

在用XSSF处理Excel数据时,使用FileOutputStream fout = new FileOutputStream(filePath);新建的Excel在写入数据之前是不能用Excel打开的。一打开会报错说格式不对或已经受损不能打开,具体原因这篇说的很清楚:http://blog.csdn.net/iaiti/article/details/45153627。开始的时候我还以为是我的Excel新建的有问题导致每次都“org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file”,后来手动建 了一个能使用的2007的Excel放那儿让XSSF去读,结果还是这错,最后用XSSF往这个Excel里面写入数据后打开就没有任何问题啦。这也说明Can't open the specified file这个异常不是Excel弄出来的,是XSSF。

 

应该没有其他问题了吧,再出现了再补吧(附件太大了,只能压缩再压缩了,莫怪莫怪!)。 

你可能感兴趣的:(JXL,POI日期问题)