java利用poi解析excel表格
引入的依赖
<!--利用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>
简单说明
主要有四个属性,Workbook(工作表),Sheet(表单),Row(行), Cell(单元格)
需要读取的文件
读取的Excel文件
读取Excel
思路是按照Workbook,Sheet,Row,Cell一层一层往下读取。
首先是初始化Workbook
由于采用工厂模式,所用不用单独去区分excel的版本
/**
* 获取Excel,将数据转换成 List<String> 的形式
* Excel 数据要求第一行为对象的属性名称
* @param filePath
* @param fileName
* @return
* @throws FileNotFoundException
*/
public static List<List<String>> readExcelToList(String filePath, String fileName) throws FileNotFoundException {
List<List<String>> result=new ArrayList<>();
Workbook workbook = null;
FileInputStream inputStream = null;
try {
// 获取Excel文件
// File excelFile = new File(fileName);
File excelFile = new File(filePath + File.separator + fileName);
if (!excelFile.exists()) {
logger.warn("指定的Excel文件不存在!");
return null;
}
inputStream = new FileInputStream(excelFile);
// 使用工厂模式 根据文件扩展名 创建对应的Workbook xls以及xlxs都可以
workbook = WorkbookFactory.create(inputStream);
// Sheet sheet = workbook.getSheet(sheetName); 不根据sheetname获取页面,直接遍历
for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
Sheet sheet = workbook.getSheetAt(sheetNum);
// 校验sheet是否合法
if (sheet == null) {
continue;
}
// 获取第一行数据
int firstRowNum = sheet.getFirstRowNum();
Row firstRow = sheet.getRow(firstRowNum);
if (null == firstRow) {
logger.warn("解析Excel失败,在第一行没有读取到任何数据!");
}
// 解析每一行的数据,构造数据对象
int rowStart = firstRowNum + 1;
int rowEnd = sheet.getPhysicalNumberOfRows();
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row row = sheet.getRow(rowNum);
if (null == row) {
continue;
}
List<String> resultData = convertRowToString(row);
if (null == resultData) {
logger.warn("第 " + row.getRowNum() + "行数据不合法,已忽略!");
continue;
}
result.add(resultData);
}
return result;
}
}catch (Exception e){
logger.warn("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
return null;
}finally {
try {
if (null != workbook) {
workbook.close();
}
if (null != inputStream) {
inputStream.close();
}
} catch (Exception e) {
logger.warn("关闭数据流出错!错误信息:" + e.getMessage());
return null;
}
}
return null;
}
解析每一行
/**
* 读取每行中的每列数据
* 将每列数据转换为String
* @param row
* @return
*/
public static List<String> convertRowToString(Row row){
List<String> list=new ArrayList<>();
Cell cell;
int cellNum = 0;
if(row.getLastCellNum()==-1){
return null;
}
//开始读取每行中的每一列数据
for(int j=0;j<row.getLastCellNum();j++){
cell = row.getCell(j);
String var = convertCellValueToString(cell);
list.add(var);
}
return list;
}
转换单元格内的字符串
/**
* 将单元格内容转换为字符串
* @param cell
* @return
*/
private static String convertCellValueToString(Cell cell) {
if(cell==null){
return null;
}
String returnValue = null;
switch (cell.getCellType()) {
case NUMERIC: //数字
Double doubleValue = cell.getNumericCellValue();
// 格式化科学计数法,取一位整数
DecimalFormat df = new DecimalFormat("0");
returnValue = df.format(doubleValue);
break;
case STRING: //字符串
returnValue = cell.getStringCellValue();
break;
case BOOLEAN: //布尔
boolean booleanValue = cell.getBooleanCellValue();
returnValue = Boolean.toString(booleanValue);
break;
case BLANK: // 空值
break;
case FORMULA: // 公式
returnValue = cell.getCellFormula();
break;
case ERROR: // 故障
break;
default:
break;
}
return returnValue;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步