在最近的一个项目中用户要求把原来的历史数据导入到新的系统中,我们用Java为用户开发的系统,用户提供的数据格式为Excel文件。于是, 我想到了使用apache的POI,因为以前使用过,觉得还可以,先做了个测试,感觉没什么问题,但是在导入另外一个文件时出错了,系统捕获一个javaCastException.引发这一异常的原因是由于java.util.TreeMap进行类型比较时出现的错误,由于POI时开发源代码的,于是我跟踪了代码出错的位置,发现是POI一个内部的错误,并且这个BUG已经提交到了apache的bugzilla中了。导致这个异常的原因是由于,客户提供的Excel文件是由原来的一个系统中通过程序生成的Excel文件,所以在读的时候由于文件头的错误而造成的。本来想试着自己改一下的,但是时间太紧就改变了主意,决定使用另外一个库,在sourceforge中找到了jxl。试用了一下,还是不错的,虽然在读那个比较特殊的文件时出现了警告,但是并不影响读出数据的准确性。下面我把实现的方法记下来。
import java.io.File;
import java.util.Date;
import jxl.*;
import jxl.read.biff.*;
import java.io.*;
public class testjeapi {
public testjeapi() {
try {
Workbook workbook = Workbook.getWorkbook(new File("C:/TEMP/ehc.XLS"));
Sheet sheet = workbook.getSheet(0);
int rows=sheet.getRows();
for(int i=1;i<rows;i++){
String cbxmdm=sheet.getCell(0,i).getContents();
String cbxmmc=sheet.getCell(1,i).getContents();
// String jfsl=sheet.getCell(7,i).getContents().replaceAll(",","");
//System.out.println("jfsl:"+jfsl);
NumberCell n=(NumberCell)sheet.getCell(7,i);//NumberCell用于读取数字格式的单元格。
System.out.println("n:"+n.getValue());
Double d=new Double(n.getValue());
System.out.println("d:"+d);
// System.out.println("cell format:"+sheet.getCell(7,i).getType());
// String jfsl=sheet.getCell(7,i).getContents();
// String jfje=NumberCell.getCell(8,i).getContents();
// Double dfsl=new Double(NumberCell.getCell(9,i).getContents());
// String dfje=sheet.getCell(10,i).getContents();
// System.out.println(i+"|cbxmdm:"+cbxmdm+"|"+"cbxmmc:"+cbxmmc+"|"+"jfsl:"+jfsl+"|"+"jfje:"+jfje+"|dfsl:"+dfsl+"|dfje:"+dfje);
}
}
catch (BiffException ex) {
ex.printStackTrace();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
testjeapi testjeapi1 = new testjeapi();
}