一. 测试环境
使用maven构建的ssm框架,本示例中其实只有一个主函数,简单介绍poi解析excel.
二.maven引入的依赖.
本示例使用的是3.16版本
<!--利用poi 读取excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
三. 新建一个测试类,用来测试一下poi的具体使用
package tax_excel.common;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil {
public static void main(String[] args) {
// 声明inoutStream,用来创建Workbook
FileInputStream inputStream = null;
// Workbook对象对应一个Excel表格
Workbook wb = null;
// 声明文件的位置,然后需要根据文件的后缀判断表格是那个版本,.xls版本使用HSSFWorkbook进行处理
// .xlsx使用XSSFWorkbook进行处理
String fileName = "F:\\Test\\ExcelTest\\Excel 97-2003.xls";
try {
inputStream = new FileInputStream(fileName);
// .xls结尾的是Excel2007之前的版本,不包括2007
if (fileName.endsWith(".xls")) {
wb = new HSSFWorkbook(inputStream);
// .xlsx结尾的是Excel2007之后版本,包括2007
} else if (fileName.endsWith(".xlsx")) {
wb = new XSSFWorkbook(inputStream);
}
// 一个Excel文件中可以有多张表,每个sheet对象代表着一张表,wb.getNumberOfSheets()获取一共有几张表
int sheetTotal = wb.getNumberOfSheets();
System.out.println("sheetTotal--->:" + sheetTotal);
// 遍历每个表
for (int i = 0; i < sheetTotal; i++) {
// 从0开始,得到每一张表
Sheet sheet = wb.getSheetAt(i);
// 表名
System.err.println("Excel文件中每个表单的名字--->:" + sheet.getSheetName());
// getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况,也就是不包括那些空行(隔行)的情况,
// 如果你的表单数据中间有空行的话,那么你不能用这个判断需要遍历多少hang
int rowLength = sheet.getPhysicalNumberOfRows();
System.out.println("打印物理行数--->:" + rowLength);
// getLastRowNum()获取的是最后一行的编号(编号从0开始)
rowLength = sheet.getLastRowNum();
for (int j = 0; j <= rowLength; j++) {
Row row = sheet.getRow(j);
short cellLength = 0;
// 确定这一行不为空,我们才会继续获取数据
if (row != null) {
cellLength = row.getLastCellNum();
for (int k = 0; k < cellLength; k++) {
// 从0开始获取每个单元格
Cell cell = row.getCell(k);
// getCellStringValue(cell)这个是自己封装的方法,用来获取每个单元格的数据,将不同类型的数据转成String类型
// 这个方法中处理公式类型的cell时,是将其数值转成String类型返回,而且也不够完善,请参考使用
String val = cell != null ? getCellStringValue(cell) : "";
System.err.print(val + " \t");
}
System.out.println("");
}
}
System.err.println("------------一个表单的结束-------------");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {// 需要注意的是使用资源文件,各种流等,要记得关闭
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (wb != null) {
try {
wb.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 传入cell,获取cell值(String类型)
* @param cell
* @return
*/
public static String getCellStringValue(Cell cell) {
String cellValue = "";
// cell.getCellTypeEnum(),获取单元格类型,case不同类型进行不同处理
switch (cell.getCellTypeEnum()) {
case _NONE: // 未知类型,用于表示初始化前的状态或缺少具体类型。仅供内部使用。
break;
case NUMERIC: // 数字类型 小数,整数,日期
// 如果是数字类型的话,判断是不是日期类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 获取日期类型的单元格的值
Date d = cell.getDateCellValue();
// 进行格式转换
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
cellValue = formatter.format(d);
} else {// 如果不是日期类型的单元格,那么将单元格格式设置成String,然后取值,这里可能会处问题,需要自己多尝试一下
cell.setCellType(CellType.STRING);
cellValue = cell.getStringCellValue();
}
break;
case STRING: // 字符串类型
cellValue = cell.getStringCellValue();
break;
case FORMULA: // 公式类型
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case BLANK: // 空白的单元格
break;
case BOOLEAN: // 布尔类型
break;
case ERROR: // 错误类型
break;
default:
break;
}
return cellValue;
}
}
四. 在代码中有简单的示例和相应的注释,详细API参考:
POI官方API文档