Java开发中常会遇操作处理word中的execl表格数据,今天遇到这个问题做一个简单的总结,以后自己用起来方便。
Java--POI 操作解析Excel主要的步骤:
1.首先通过输入的文件路径或者文件目录查找出符合格式的Excel文件,并创建一个execl对象
//创建Workbook对象(这一个对象代表着对应的一个Excel文件)
其中最主要的两个方法: HSSFWorkbook():是操作Excel2003以前(包括2003)的版本,扩展名是.xls;
XSSFWorkbook():是操作Excel2007的版本,扩展名是.xlsx;
//通过文件名称来判断文件是否符合格式
public static final Workbook createWb(String filePath) throws IOException {
if (filePath == null || filePath == "") {
return null;
}
if (filePath.trim().toLowerCase().endsWith("xls")) {
return new HSSFWorkbook(new FileInputStream(filePath));
} else if (filePath.trim().toLowerCase().endsWith("xlsx")) {
return new XSSFWorkbook(new FileInputStream(filePath));
} else {
System.out.print("不支持除:xls/xlsx以外的文件格式!!!");
return null;
}
}
//输入文件目录来判断获取文件
public static final Workbook createWb(File file) throws IOException {
if (file == null || !file.exists()) {
return null;
}
String filePath = file.getAbsolutePath();
if (filePath.trim().toLowerCase().endsWith("xls")) {
return new HSSFWorkbook(new FileInputStream(file));
} else if (filePath.trim().toLowerCase().endsWith("xlsx")) {
return new XSSFWorkbook(new FileInputStream(file));
} else {
System.out.print("不支持除:xls/xlsx以外的文件格式!!!");
return null;
}
}
2. 获取execl文件中的一个工作表格单元,可以用两种方法,第一种就是通过(ececl对象,工作表名称),第二种通过工作表的索引来返回工作表单元,默认第一个工作表的索引为0,
public static final Sheet getSheet(Workbook wb, String sheetName) {
return wb.getSheet(sheetName);
}
public static final Sheet getSheet(Workbook wb, int index) {
return wb.getSheetAt(index);
}
3. 循环获取整个ececl 工作表sheet的整个单元,通过行和列来获取。 简单的理解ececl表格: 每一行可以看作是一个对象,每行中的每列数据就可以看作是这个对象的属性值,多行就组成了一个对象集合
public static final List<Object[]> listFromSheet(Sheet sheet) {
int rowTotal = sheet.getPhysicalNumberOfRows();
System.out.println(sheet.getSheetName() + "共有" + rowTotal + "行记录!");
List<Object[]> list = new ArrayList<Object[]>();
for (int r = sheet.getFirstRowNum(); r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null)
continue;
// 不能用row.getPhysicalNumberOfCells(),可能会有空cell导致索引溢出
// 使用row.getLastCellNum()至少可以保证索引不溢出,但会有很多Null值,如果使用集合的话,就不说了
Object[] cells = new Object[row.getLastCellNum()];
for (int c = row.getFirstCellNum(); c <= row.getLastCellNum(); c++) {
Cell cell = row.getCell(c);
if (cell != null && c == 0) {
if (cell.toString().equalsIgnoreCase("id")||cell.toString().equalsIgnoreCase("学号")||cell.toString().equalsIgnoreCase("studentid")) {
break;
}
}
if (c >= row.getLastCellNum() && cell == null) {
continue;
}
try {
cells[c] = getValueFromCell(cell);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("--------------"+r+"-----------"+c);
e.printStackTrace();
throw new RuntimeException();
}
}
if (cells[0] != null)
list.add(cells);
}
return list;
}
4. 最后获取每个单元格的数据
public static final String getValueFromCell(Cell cell) throws Exception {
if (cell == null) {
System.out.printf("Cell is null !!!");
return "";
}
String value = null;
//核心代码就是找到每个单元格的数据,并返回这个单元格的坐标
// 使用[]记录坐标
return value;// + "["+cell.getRowIndex()+","+cell.getColumnIndex()+"]" ;
}