|
@@ -0,0 +1,200 @@
|
|
|
+package thyyxxk.webserver.utils;
|
|
|
+
|
|
|
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Excel文件读取工具类,支持xls和xlsx格式
|
|
|
+ */
|
|
|
+public class ExcelReaderUtil {
|
|
|
+
|
|
|
+ private static final String XLS = "xls";
|
|
|
+ private static final String XLSX = "xlsx";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取Excel文件内容
|
|
|
+ * @param file Excel文件
|
|
|
+ * @return 表格数据列表,每个元素是一行数据的列表
|
|
|
+ * @throws IOException 当文件操作发生错误时抛出
|
|
|
+ */
|
|
|
+ public static List<List<String>> readExcel(File file) throws IOException {
|
|
|
+ // 验证文件
|
|
|
+ validateFile(file);
|
|
|
+
|
|
|
+ // 根据文件后缀名创建对应的Workbook
|
|
|
+ try (InputStream is = new FileInputStream(file)) {
|
|
|
+ Workbook workbook;
|
|
|
+ if (file.getName().endsWith(XLS)) {
|
|
|
+ workbook = new HSSFWorkbook(is);
|
|
|
+ } else if (file.getName().endsWith(XLSX)) {
|
|
|
+ workbook = new XSSFWorkbook(is);
|
|
|
+ } else {
|
|
|
+ throw new IllegalArgumentException("不支持的文件格式,仅支持xls和xlsx格式");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 读取所有工作表数据
|
|
|
+ List<List<String>> result = new ArrayList<>();
|
|
|
+ for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
|
|
|
+ Sheet sheet = workbook.getSheetAt(sheetNum);
|
|
|
+ if (sheet == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 读取当前工作表数据
|
|
|
+ readSheet(sheet, result);
|
|
|
+ }
|
|
|
+
|
|
|
+ workbook.close();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取指定工作表的内容
|
|
|
+ * @param file Excel文件
|
|
|
+ * @param sheetIndex 工作表索引(从0开始)
|
|
|
+ * @return 表格数据列表,每个元素是一行数据的列表
|
|
|
+ * @throws IOException 当文件操作发生错误时抛出
|
|
|
+ */
|
|
|
+ public static List<List<String>> readExcelBySheet(File file, int sheetIndex) throws IOException {
|
|
|
+ // 验证文件
|
|
|
+ validateFile(file);
|
|
|
+
|
|
|
+ // 根据文件后缀名创建对应的Workbook
|
|
|
+ try (InputStream is = new FileInputStream(file)) {
|
|
|
+ Workbook workbook;
|
|
|
+ if (file.getName().endsWith(XLS)) {
|
|
|
+ workbook = new HSSFWorkbook(is);
|
|
|
+ } else if (file.getName().endsWith(XLSX)) {
|
|
|
+ workbook = new XSSFWorkbook(is);
|
|
|
+ } else {
|
|
|
+ throw new IllegalArgumentException("不支持的文件格式,仅支持xls和xlsx格式");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证工作表索引
|
|
|
+ if (sheetIndex < 0 || sheetIndex >= workbook.getNumberOfSheets()) {
|
|
|
+ throw new IllegalArgumentException("工作表索引超出范围");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 读取指定工作表数据
|
|
|
+ List<List<String>> result = new ArrayList<>();
|
|
|
+ Sheet sheet = workbook.getSheetAt(sheetIndex);
|
|
|
+ if (sheet != null) {
|
|
|
+ readSheet(sheet, result);
|
|
|
+ }
|
|
|
+
|
|
|
+ workbook.close();
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取单个工作表的数据
|
|
|
+ * @param sheet 工作表对象
|
|
|
+ * @param result 存储结果的列表
|
|
|
+ */
|
|
|
+ private static void readSheet(Sheet sheet, List<List<String>> result) {
|
|
|
+ // 获取首行和尾行
|
|
|
+ int firstRowNum = sheet.getFirstRowNum();
|
|
|
+ int lastRowNum = sheet.getLastRowNum();
|
|
|
+
|
|
|
+ // 遍历所有行
|
|
|
+ for (int rowNum = firstRowNum; rowNum <= lastRowNum; rowNum++) {
|
|
|
+ Row row = sheet.getRow(rowNum);
|
|
|
+ if (row == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 读取当前行数据
|
|
|
+ List<String> rowData = new ArrayList<>();
|
|
|
+ int firstCellNum = row.getFirstCellNum();
|
|
|
+ int lastCellNum = row.getLastCellNum();
|
|
|
+
|
|
|
+ for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
|
|
|
+ Cell cell = row.getCell(cellNum, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
|
|
|
+ rowData.add(getCellValue(cell));
|
|
|
+ }
|
|
|
+
|
|
|
+ result.add(rowData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取单元格的值
|
|
|
+ * @param cell 单元格对象
|
|
|
+ * @return 单元格的字符串值
|
|
|
+ */
|
|
|
+ private static String getCellValue(Cell cell) {
|
|
|
+ if (cell == null) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据单元格类型获取值
|
|
|
+ String cellValue;
|
|
|
+ switch (cell.getCellType()) {
|
|
|
+ case STRING:
|
|
|
+ cellValue = cell.getStringCellValue();
|
|
|
+ break;
|
|
|
+ case NUMERIC:
|
|
|
+ cellValue = cell.getDateCellValue().toString();
|
|
|
+ break;
|
|
|
+ case BOOLEAN:
|
|
|
+ cellValue = String.valueOf(cell.getBooleanCellValue());
|
|
|
+ break;
|
|
|
+ case FORMULA:
|
|
|
+ // 计算公式结果
|
|
|
+ Workbook workbook = cell.getSheet().getWorkbook();
|
|
|
+ FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
|
|
|
+ cellValue = getCellValue(evaluator.evaluateInCell(cell));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ cellValue = "";
|
|
|
+ }
|
|
|
+
|
|
|
+ return cellValue.trim();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证文件是否有效
|
|
|
+ * @param file 要验证的文件
|
|
|
+ */
|
|
|
+ private static void validateFile(File file) {
|
|
|
+ if (file == null) {
|
|
|
+ throw new IllegalArgumentException("文件不能为空");
|
|
|
+ }
|
|
|
+ if (!file.exists()) {
|
|
|
+ throw new IllegalArgumentException("文件不存在: " + file.getAbsolutePath());
|
|
|
+ }
|
|
|
+ if (!file.isFile()) {
|
|
|
+ throw new IllegalArgumentException("不是一个文件: " + file.getAbsolutePath());
|
|
|
+ }
|
|
|
+ if (!file.getName().endsWith(XLS) && !file.getName().endsWith(XLSX)) {
|
|
|
+ throw new IllegalArgumentException("不支持的文件格式,仅支持xls和xlsx格式");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 使用示例
|
|
|
+ public static void main(String[] args) {
|
|
|
+ try {
|
|
|
+ File file = new File("D:\\his\\基础数据\\铭和\\上级专家(2).xlsx");
|
|
|
+ List<List<String>> data = ExcelReaderUtil.readExcel(file);
|
|
|
+
|
|
|
+ // 打印读取到的数据
|
|
|
+ for (List<String> row : data) {
|
|
|
+ System.out.println(row);
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|