首先建立maven工程
在<dependencies></dependencies> 中加入
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
poi包中只有 HSSF (处理xls,即 2003 版及以前的)
poi-ooxml包中有对 XSSF(处理xlsx,处理 2007版及以后的)
但是只有这两个包可能会出错,出现找不到 XMLBEAN的异常( 不一定出现,选择性导入 )
如果还有异常:再导入一个
<!-- 我的导入这四个maven就完全可以运行 -->
了解在处理Excel中常见的类与方法
以操作2007版的XSSF举例
XSSFWorkbook wb -- 获得一个Excel 文件 , 参数为文件,用完记得关闭
XSSFSheet sheet -- 获得Excel文件中的 sheet
sheet.getFirstRowNum() -- 获得第一个有效行下标(即存在有效数据)
sheet.getPhysicalNumberOfRows() -- 获得物理的总行数,即被编辑过得总行数
sheet.getRow(i) -- 获得第i行对象
XSSFRow row -- 行对象
row.getFirstCellNum() -- 获得第一个有效单元格下标
row.getLastCellNum() -- 获得最后一个有效单元格下标
XSSFCell cell -- 单元格对象
cell.getCellTypeEnum() -- 获得当前单元格的格式枚举
NUMERIC -- 枚举,表示为数值
BLANK -- 枚举,表示为空白
STRING -- 枚举,表示为字符串
BOOLEAN -- 枚举,表示为布尔值
FORMULA -- 枚举,表示为公式
ERROR -- 枚举,表示为错误
贴一段代码方便理解(改编自别人的),这是将excel的数据存入二维ArrayList中的
ArrayList<ArrayList<Object>> rowList = new ArrayList<ArrayList<Object>>();
ArrayList<Object> colList;
wb = new XSSFWorkbook(new FileInputStream(file));
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row;
XSSFCell cell;
Object value;
for (int i = sheet.getFirstRowNum(), rowCount = 0; rowCount < sheet.getPhysicalNumberOfRows(); i++) {
row = sheet.getRow(i);
colList = new ArrayList<Object>();
if (row == null) {
// 当读取行为空时
if (i != sheet.getPhysicalNumberOfRows()) {// 判断是否是最后一行
rowList.add(colList);
}
continue;
} else {
rowCount++;
}
for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
cell = row.getCell(j);
if (cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) {
// 当该单元格为空
if (j != row.getLastCellNum()) {// 判断是否是该行中最后一个单元格
colList.add("");
}
continue;
}
switch (cell.getCellTypeEnum()) {
case NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
value = df.format(cell.getNumericCellValue());
} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
value = nf.format(cell.getNumericCellValue());
} else {
value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
}
System.out.println(i + "行" + j + " 列 is Number type " + value.toString());
break;
case BLANK:
System.out.println(i + "行" + j + " 列 is Blank type");
value = "";
break;
case STRING:
System.out.println(i + "行" + j + " 列 is String type " + cell.getStringCellValue());
value = cell.getStringCellValue();
break;
case BOOLEAN:
System.out.println(i + "行" + j + " 列 is Boolean type");
value = Boolean.valueOf(cell.getBooleanCellValue());
break;
default:
System.out.println(i + "行" + j + " 列 is default type" );
value = cell.toString();
}// end switch
colList.add(value);
} // end for j
rowList.add(colList);
} // end for i