首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Excel 導入工具類:JXL 解析、BeanUtils 映射、行級校驗介面設計

     編輯:Java 程式設計入門

依賴

<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version>
</dependency>
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>

注意: JXL 僅支援 `.xls` (BIFF8),`.xlsx` 請用 Apache POI。

核心工具類 ExcelUtils

public class ExcelUtils {
    private static final Logger log = LoggerFactory.getLogger(ExcelUtils.class);

    /** 解析 Excel → List> */
    public static List> parse(InputStream is, List columnNames) throws Exception {
        if (is == null) return Collections.emptyList();
        Workbook wb;
        try { wb = Workbook.getWorkbook(is); }
        catch (BiffException | IOException e) { log.error("Excel 解析失敗", e); return Collections.emptyList(); }

        Sheet sheet = wb.getSheet(0);
        int rows = sheet.getRows(); // 含標題行
        List> data = new ArrayList<>(rows - 1);

        for (int r = 1; r < rows; r++) { // 跳過標題
            Map rowMap = new HashMap<>();
            for (int c = 0; c < columnNames.size(); c++) {
                Cell cell = sheet.getCell(c, r);
                rowMap.put(columnNames.get(c), cell.getContents());
            }
            data.add(rowMap);
        }
        return data;
    }

    /** Map 列表 → 實體列表(含行校驗) */
    public static  List toBeans(List> data, Class clazz, 
                                      List columnNames, CheckExcel checker) throws Exception {
        if (data == null || clazz == null || checker == null) return Collections.emptyList();
        List result = new ArrayList<>(data.size());
        for (Map row : data) {
            if (!checker.check(row)) continue; // 校驗不通過跳過
            T bean = clazz.getDeclaredConstructor().newInstance();
            for (String col : columnNames) {
                BeanUtils.setProperty(bean, col, row.get(col));
            }
            result.add(bean);
        }
        return result;
    }
}

/** 行校驗介面 */
public interface CheckExcel {
    boolean check(Map row);
}

調用範例

List cols = Arrays.asList("name", "amount", "date"); // 對應 Excel 欄位順序
List> raw = ExcelUtils.parse(inputStream, cols);

List list = ExcelUtils.toBeans(raw, FeeAllocation.class, cols, row -> {
    String name = row.get("name");
    return name != null && !name.trim().isEmpty(); // 必填欄位校驗
});

進階遷移:Apache POI 支援 .xlsx

// POI 通用解析(支援 .xls/.xlsx)
Workbook wb = WorkbookFactory.create(inputStream); // 自動識別格式
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
    if (row.getRowNum() == 0) continue; // 標題
    Cell nameCell = row.getCell(0);
    String name = nameCell.getStringCellValue();
    // ...
}
wb.close();

大檔案優化:SXSSF / 事件驅動模式

  • SXSSF:流式寫入大 Excel,內存只保留滾動窗口行
  • XSSF 事件模型:SAX 風格讀取,不載入整個 DOM,適合超大檔案導入

常見問題

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題解決
數字讀成科學計數法JXL cell.getContents() 返回原始字串,POI 需 DataFormatter
日期格式混亂統一在實體類用 @DateTimeFormat 或自定義轉換器
合併儲存格需額外處理 sheet.getMergedCells()
記憶體溢出改用 POI 事件模型或分批提交入庫