我们可以使用POI操作Excel文件,本文主要介绍:“导入POI的Maven依赖”、“创建Poi对象”、“Poi读取Excel工作表数目”、“Poi读取Excel名称”、“Poi读取Excel一列数据,放到list集合中”、“读取单元格数据”、“Poi读取Excel一行数据,放到List集合”。

1、导入POI的Maven依赖。

<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>

2、创建Poi对象。

protected Workbook wb;

	private PoiUtils() {
	}

	public PoiUtils(String filePath) throws IOException {
		InputStream inputStream = new FileInputStream(filePath);
		if (filePath.endsWith(".xls")) {
			wb = new HSSFWorkbook(inputStream); // 处理以.xls结尾的excel
		} else {
			wb = new XSSFWorkbook(inputStream);// 处理以.xlsx结尾的excel
		}
	}

3、Poi读取Excel工作表数目。

/** @return -1 读取文件发生意外 */
	public int readExcelSheetNO(String file) {
		try {
			int sheetNO = wb.getNumberOfSheets();
			wb.close();
			return sheetNO;
		} catch (IOException e) {
			e.printStackTrace();
			return -1;
		}
	}

4、Poi读取Excel名称。

/** @return 空串,读取文件发生意外 */
	public String readExcelSheetName(String file, int sheetAtNO) {
		try {
			String sheetName = wb.getSheetName(sheetAtNO);
			wb.close();
			return sheetName;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}

5、Poi读取Excel一列数据,放到list集合中。

/** 读取Excel表格一列内容
	 * 
	 * @return null,读取文件发生意外 */
	public List<String> readExcelCell(String file, int sheetAtNO, int cellNO) {
		List<String> listRow = new ArrayList<String>();
		// 解析公式结果
		try {
			FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
			Sheet sheet = wb.getSheetAt(sheetAtNO);
			listRow = doReadExcelCell(cellNO, evaluator, sheet);
			wb.close();
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}

		return listRow;
	}

	private List<String> doReadExcelCell(int cellNO, FormulaEvaluator evaluator, Sheet sheet) {
		int maxRow = sheet.getPhysicalNumberOfRows(); // 总行数
		System.out.println("总行数maxRow:" + maxRow);
		List<String> listRow = new ArrayList<String>();
		for (int i = 0; i < maxRow; i++) {
			Row row = sheet.getRow(i);
			if(row == null) {
				return null;
			}
			Cell cell = row.getCell((short) cellNO);
			CellValue cellValue = evaluator.evaluate(cell);
			if (cellValue == null) {
				listRow.add(null);
				continue;
			}
			listRow.add(getCellFormatValue(i, cellNO, cellValue));
		}
		return listRow;
	}

6、读取单元格数据。

/** 根据Cell类型设置数据
	 * 
	 * @param i
	 * @param rowNO
	 * 
	 * @param cellValue
	 * @return */
	private String getCellFormatValue(int rowNO, int column, CellValue cellValue) {
		String cellStringValueOf = "";
		if (cellValue != null) {
			// 经过公式转换,函数只剩下数值型、布尔型、字符串型
			// 判断当前Cell的Type
			switch (cellValue.getCellTypeEnum()) {
			case NUMERIC: // 数值型
				if (String.valueOf(cellValue.getNumberValue()).contains(".")) {
					NumberFormat numberFormat = NumberFormat.getInstance();
					numberFormat.setGroupingUsed(false);
					cellStringValueOf = numberFormat.format(cellValue.getNumberValue());
				} else {
					cellStringValueOf = String.valueOf(cellValue.getNumberValue());
				}
				break;
			case BOOLEAN: // 布尔型
				cellStringValueOf = String.valueOf(cellValue.getBooleanValue());
				break;
			case ERROR: // 错误
				System.out.println("读取错误" + ",行:" + rowNO + ",列:" + column);
				break;
			case BLANK: // 空值
				break;
			case FORMULA: // 公式型
				break;
			default: // 字符串型
				cellStringValueOf = cellValue.getStringValue();
				break;
			}
		} else {
			System.out.println("读取错误");
		}
		return cellStringValueOf;
	}

7、Poi读取Excel一行数据,放到List集合。

/** @param file
	 *            要读取的文件路径
	 * @param sheetAtNO
	 *            读取名称为sheetName的表格
	 * @param rowNO
	 *            读取第n+1行
	 * @return null,读取文件发生意外 */
	public List<String> readExcelRow(String file, String sheetName, int rowNO) {
		// 解析公式结果
		try {
			FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
			Sheet sheet = wb.getSheet(sheetName);
			List<String> listRow = new ArrayList<String>();
			listRow = readRow(rowNO, evaluator, sheet);
			wb.close();
			return listRow;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	/** 读取一行数据 */
	protected List<String> readRow(int rowNO, FormulaEvaluator evaluator, Sheet sheet) {
		Row titleRow = sheet.getRow(0);// 第一行的条数
		Row row = sheet.getRow(rowNO);
		// 首行总列数
		int titleColNum = titleRow.getPhysicalNumberOfCells();
		// System.out.println("首行总列数titleColNum:" + titleColNum);
		// // 这行总列数
		// int colNum = row.getPhysicalNumberOfCells();
		// System.out.println("总列数colNum:" + colNum);
		List<String> listRow = new ArrayList<String>();
		for (int i = 0; i < titleColNum; i++) {
			Cell cell = row.getCell((short) i);
			CellValue cellValue = evaluator.evaluate(cell);
			if (cellValue == null) {
				listRow.add(null);
				continue;
			}
			listRow.add(getCellFormatValue(rowNO, i, cellValue));
		}
		return listRow;
	}