poi方式解析Excel文件:
支持:EXCEL97,2000,2003,和EXCEL2007。
注意:据说97和2000和03版本的Excel文件底层存储结构是一样的。所以我们可以用如下包的HSSFWordbook类来解析并将excel文件封装成对象。EXCEL2007底层结构据说改成xml了,所以其解析封装Excel文件不能用上述HSSFWordbook类,改用XSSFWordbook类来封装07版本的Excel文件,其余方法基本类似。
上述几种版本可共用如下文件包:
写一个工具类ExcelUtil,用于解析Excel文件,该工具可以解析03和07版本的Excel文件,
基本代码结构如下:
If(07以下版本Excel文件) {
FileInputStream fis=new FileInputStream(fileName);
POIFSFileSystem fs = new POIFSFileSystem(fis);
HSSFWorkbook wordbook = new HSSFWorkbook(fs);
//调用解析HSSFWordbook类的方法,解析并封装该文件
Return readHSSFWordbook(wordbook);
}else if(07版本) {
XSSFWorkbook wordbook=null;
wordbook = new XSSFWorkbook(fileURL);
//调用解析XSSFWordbook类的方法,解析并封装该文件
Return readXSSFWordbook(wordbook);
}
注意:由于我项目需要导入的文件数据量不多,所以我调用上述read方法时是一次将整个文件解析并存放在一个集合中,然后再对这些数据进行后续操作。如果各位大拿有大数据量的文件要解析导入最好分批次解析导入,否则很可能发生内存溢出的情况。
如下是我项目里用到的read方法:HSSFWordbook的read方法类似,在这就不详细描述了
private static ArrayList<String[]> readXSSFAllRows(XSSFWorkbook wordbook) {
ArrayList<String[]> rowList = new ArrayList<String[]>();
try {
XSSFSheet sheet = null;
XSSFRow row = null;
XSSFCell cell = null;
sheet = wordbook.getSheetAt(0);
int rowNum = 0;
for (Iterator<?> rows = sheet.iterator(); rows.hasNext(); rowNum++) {
row = (XSSFRow) rows.next();
int col = 0;
int lastCellNum = (int) row.getLastCellNum();
String[] aCells = new String[lastCellNum];
while (col < lastCellNum) {
try {
cell = row.getCell(col);
aCells[col] = ExcelUtils.readXSSFAllCell(cell);
} catch (Exception ex) {
ex.printStackTrace();
}
col++;
}
boolean notBlankLine = false;
for (int k = 0; k < aCells.length; k++) {
if (aCells[k] != null && aCells[k].length() > 0) {
notBlankLine = true;
break;
}
}
if (notBlankLine) {
rowList.add(aCells);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return rowList;
}