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

Java Web 讀取 Excel 文件完整實戰範例

     編輯:Java 相關知識

技術棧與依賴

  • JDK 1.8+
  • Servlet API 3.1+
  • JExcelApi (jxl.jar) —— 處理 .xls 格式
  • Maven 坐標:<dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version></dependency>

專案結構

src/
├── main/
│   ├── java/
│   │   └── com/example/
│   │       ├── servlet/ReadExcelServlet.java
│   │       └── model/Data.java
│   ├── resources/
│   │   └── data.xls
│   └── webapp/
│       ├── index.jsp
│       └── WEB-INF/web.xml

核心代碼實現

1. 實體類 Data.java

package com.example.model;

public class Data {
    private String id;
    private String name;
    private String password;

    public Data() {}
    public Data(String id, String name, String password) {
        this.id = id; this.name = name; this.password = password;
    }
    // Getter/Setter 省略...
}

2. Servlet 讀取邏輯 ReadExcelServlet.java

package com.example.servlet;

import com.example.model.Data;
import jxl.Cell;
import jxl.Workbook;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/readExcel")
public class ReadExcelServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        // 1. 獲取文件絕對路徑
        String realPath = getServletContext().getRealPath("/data.xls");
        File file = new File(realPath);
        
        List dataList = new ArrayList<>();
        
        try (Workbook wb = Workbook.getWorkbook(file)) {
            // 2. 獲取第一個工作表
            jxl.Sheet sheet = wb.getSheet(0);
            
            // 3. 逐行讀取(跳過標題行 i=1)
            for (int i = 1; i < sheet.getRows(); i++) {
                Cell[] row = sheet.getRow(i);
                if (row.length >= 3) {
                    Data data = new Data(
                        row[0].getContents(),
                        row[1].getContents(),
                        row[2].getContents()
                    );
                    dataList.add(data);
                }
            }
        } catch (Exception e) {
            throw new ServletException("Excel 解析失敗", e);
        }
        
        // 4. 存入請求域轉發至 JSP
        req.setAttribute("dataList", dataList);
        req.getRequestDispatcher("/index.jsp").forward(req, resp);
    }
}

3. 前端展示 index.jsp

<%@ page import="java.util.List, com.example.model.Data" %>
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<html>
<body>
  <form action="${pageContext.request.contextPath}/readExcel" method="get">
    <button type="submit">讀取 Excel 數據</button>
  </form>
  
  <c:if test="${not empty dataList}">
    <table border="1" cellpadding="5">
      <thead><tr><th>ID</th><th>姓名</th><th>密碼</th></tr></thead>
      <tbody>
        <c:forEach items="${dataList}" var="d">
          <tr>
            <td>${d.id}</td>
            <td>${d.name}</td>
            <td>${d.password}</td>
          </tr>
        </c:forEach>
      </tbody>
    </table>
  </c:if>
</body>
</html>

進階優化建議

  1. 支援 .xlsx:引入 Apache POI (poi-ooxml) 替換 JExcelApi,統一處理兩種格式。
  2. 大文件流式讀取:使用 POI 的 SXSSFWorkbook 或 XSSFReader (SAX 模式) 避免 OOM。
  3. 數據校驗:讀取時進行類型轉換、非空校驗、格式檢查,收集錯誤行回饋前端。
  4. 異步處理:大文件上傳採用「上傳→異步解析→WebSocket/輪詢通知結果」模式,提升用戶體驗。
  5. 資源釋放:確保 Workbook.close() 在 finally 或 try-with-resources 中執行。

常見坑點避雷

  • JExcelApi 不支援 .xlsx,強行讀取會拋 BiffException。
  • getRealPath("/") 在 WAR 包部署或某些容器中可能返回 null,建議配置外部文件存儲路徑。
  • 單元格為空時 getContents() 返回空字串 "" 而非 null,需額外判斷。
  • 日期儲存為數值,需用 DateCell.getDate() 正確解析。

總結

本文提供了基於 JExcelApi 的 Java Web 讀取 Excel 完整最小化範例,涵蓋 Servlet 解析、實體映射、JSP 展示全鏈路。實際專案中建議遷移至 Apache POI 以支援現代格式與大文件處理,並引入校驗、異步等企業級增強。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved