現有代碼使用 POI 遍歷讀取整個 Excel 表格,返回 String[][] 二維數組。需修改為僅讀取指定行列的單元格值,提升性能並簡化邏輯。
public static String[][] getData(File file, int ignoreRows) {
List<String[]> result = new ArrayList<>();
// ... 打開工作簿 ...
for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
HSSFSheet st = wb.getSheetAt(sheetIndex);
for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {
HSSFRow row = st.getRow(rowIndex);
// ... 遍歷該行所有列 ...
result.add(values);
}
}
// 轉換為 String[][]
}
直接定位單元格坐標,避免雙重循環:
public static String getCellValue(File file, int sheetIndex, int rowIndex, int colIndex)
throws IOException {
try (FileInputStream fis = new FileInputStream(file);
HSSFWorkbook wb = new HSSFWorkbook(fis)) {
HSSFSheet sheet = wb.getSheetAt(sheetIndex);
HSSFRow row = sheet.getRow(rowIndex);
if (row == null) return null;
HSSFCell cell = row.getCell(colIndex);
if (cell == null) return "";
// 根據類型提取值
switch (cell.getCellTypeEnum()) {
case STRING: return cell.getStringCellValue();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell))
return new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
return new DecimalFormat("0.##").format(cell.getNumericCellValue());
case BOOLEAN: return String.valueOf(cell.getBooleanCellValue());
case FORMULA: return cell.getCellFormula();
default: return "";
}
}
}
// 讀取第 0 個 Sheet,第 5 行(索引 4),第 3 列(索引 2)
String value = getCellValue(file, 0, 4, 2);
System.out.println("指定單元格值: " + value);
更多 POI 單元格操作技巧請參考:POI 讀寫 Excel 詳解