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

Apache POI 實戰:Java 讀寫 Excel (.xls/.xlsx) 完整教學與代碼範例

     編輯:Java 相關知識

專案結構與依賴

專案目錄
├── src/
│   ├── XlsMain.java          // 讀取 .xls (HSSF)
│   ├── XlsDto2Excel.java     // 寫入 .xls
│   └── XlsDto.java           // 資料實體
├── pldrxkxxmb.xls            // 範例檔
└── lib/
    ├── poi-3.17.jar
    ├── poi-ooxml-3.17.jar    // .xlsx 支援 (XSSF)
    └── ...

讀取 .xls (HSSFWorkbook)

public class XlsMain {
    public static void main(String[] args) throws IOException {
        XlsMain main = new XlsMain();
        List<XlsDto> list = main.readXls();
        XlsDto2Excel.xlsDto2Excel(list); // 寫回新檔
        list.forEach(dto -> System.out.println(dto.getXh() + " " + dto.getXm() + " " +
            dto.getYxsmc() + " " + dto.getKcm() + " " + dto.getCj()));
    }

    private List<XlsDto> readXls() throws IOException {
        try (InputStream is = new FileInputStream("pldrxkxxmb.xls")) {
            HSSFWorkbook wb = new HSSFWorkbook(is);
            List<XlsDto> list = new ArrayList<>();

            for (int si = 0; si < wb.getNumberOfSheets(); si++) {
                HSSFSheet sheet = wb.getSheetAt(si);
                if (sheet == null) continue;

                for (int ri = 1; ri <= sheet.getLastRowNum(); ri++) { // 跳過標題列
                    HSSFRow row = sheet.getRow(ri);
                    if (row == null) continue;

                    XlsDto dto = new XlsDto();
                    dto.setXh(getCellValue(row.getCell(0)));      // 學號
                    dto.setXm(getCellValue(row.getCell(1)));      // 姓名
                    dto.setYxsmc(getCellValue(row.getCell(2)));   // 學院
                    dto.setKcm(getCellValue(row.getCell(3)));     // 課程
                    dto.setCj(Float.parseFloat(getCellValue(row.getCell(4)))); // 成績
                    list.add(dto);
                }
            }
            return list;
        }
    }

    private String getCellValue(HSSFCell cell) {
        if (cell == null) return "";
        switch (cell.getCellType()) {
            case BOOLEAN: return String.valueOf(cell.getBooleanCellValue());
            case NUMERIC: return String.valueOf(cell.getNumericCellValue());
            default: return String.valueOf(cell.getStringCellValue());
        }
    }
}

寫入 .xls (HSSFWorkbook)

public class XlsDto2Excel {
    public static void xlsDto2Excel(List<XlsDto> list) throws Exception {
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("pldrxkxxmb");

        // 標題列
        String[] headers = {"學號", "姓名", "學院", "課程名", "成績"};
        HSSFRow headerRow = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            HSSFCell cell = headerRow.createCell(i);
            cell.setCellValue(new HSSFRichTextString(headers[i]));
        }

        // 資料列
        for (int i = 0; i < list.size(); i++) {
            XlsDto dto = list.get(i);
            HSSFRow row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(dto.getXh());
            row.createCell(1).setCellValue(dto.getXm());
            row.createCell(2).setCellValue(dto.getYxsmc());
            row.createCell(3).setCellValue(dto.getKcm());
            row.createCell(4).setCellValue(dto.getCj());
        }

        try (OutputStream out = new FileOutputStream("POI2Excel/pldrxkxxmb.xls")) {
            wb.write(out);
            System.out.println("資料庫導出成功");
        }
    }
}

實體類

public class XlsDto {
    private Integer xkh;      // 選課號
    private String xh;        // 學號
    private String xm;        // 姓名
    private String yxsmc;     // 學院
    private Integer kch;      // 課程號
    private String kcm;       // 課程名
    private float cj;         // 成績
    // Getter/Setter 略
}

輸出結果

資料庫導出成功
1.0 hongten 信息技術學院 計算機網絡應用基礎 80.0
2.0 王五 信息技術學院 計算機網絡應用基礎 81.0
3.0 李勝基 信息技術學院 計算機網絡應用基礎 82.0
4.0 五班古 信息技術學院 計算機網絡應用基礎 83.0
5.0 蔡詩芸 信息技術學院 計算機網絡應用基礎 84.0

進階提示:支援 .xlsx (XSSF)

// 只需替換類前綴 HSSF → XSSF
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("file.xlsx"));
XSSFSheet sheet = wb.getSheetAt(0);
// 其餘 API 幾乎相同

POI 4.0+ 統一支援 WorkbookFactory.create(inputStream) 自動偵測格式。

常見坑

  • 數值儲存格可能是日期,需用 DateUtil.isCellDateFormatted(cell) 判斷
  • 大檔案用 SXSSFWorkbook (流式寫入) 避免 OOM
  • 合併儲存格需用 sheet.addMergedRegion(new CellRangeAddress(...))
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved