.xls 格式<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
Data.javapackage 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 省略...
}
ReadExcelServlet.javapackage 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);
}
}
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>
poi-ooxml) 替換 JExcelApi,統一處理兩種格式。SXSSFWorkbook 或 XSSFReader (SAX 模式) 避免 OOM。Workbook.close() 在 finally 或 try-with-resources 中執行。BiffException。getRealPath("/") 在 WAR 包部署或某些容器中可能返回 null,建議配置外部文件存儲路徑。getContents() 返回空字串 "" 而非 null,需額外判斷。DateCell.getDate() 正確解析。本文提供了基於 JExcelApi 的 Java Web 讀取 Excel 完整最小化範例,涵蓋 Servlet 解析、實體映射、JSP 展示全鏈路。實際專案中建議遷移至 Apache POI 以支援現代格式與大文件處理,並引入校驗、異步等企業級增強。