当前位置: 首页 > 工具软件 > EXCEL-UTIL4J > 使用案例 >

POI解析Excel--------poi的简单使用及格式转换

葛永丰
2023-12-01

一. 测试环境

使用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文档

 类似资料: