<form action="uploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="userFile" accept=".txt,.csv,.xls,.xlsx" />
<button type="submit">上傳解析入庫</button>
</form>
@WebServlet("/uploadServlet")
@MultipartConfig(maxFileSize = 1024*1024*10) // 10MB
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Part filePart = req.getPart("userFile");
String fileName = filePart.getSubmittedFileName();
InputStream is = filePart.getInputStream();
// 根據副檔名分派解析器
List<User> users = parseFile(is, fileName);
// 入庫
userService.batchInsert(users);
// 重導向至列表頁
resp.sendRedirect("list.jsp");
}
}
| 格式 | 解析庫 | 核心 API |
|---|---|---|
| TXT/CSV | OpenCSV / 自寫 `BufferedReader` | `CSVParser.parse()` / `readLine().split(",")` |
| Excel (.xls) | Apache POI HSSF | `HSSFWorkbook`, `Sheet`, `Row`, `Cell` |
| Excel (.xlsx) | Apache POI XSSF | `XSSFWorkbook` (同上介面) |
| Word (.docx) | Apache POI XWPF | `XWPFDocument`, `XWPFTable` 提取表格 |
public interface FileParser {
List<User> parse(InputStream is) throws IOException;
}
@Component
public class CsvParser implements FileParser {
public List<User> parse(InputStream is) {
try (CSVReader reader = new CSVReader(new InputStreamReader(is, "UTF-8"))) {
String[] header = reader.readNext(); // 假設第一行表頭
List<User> list = new ArrayList<>();
String[] line;
while ((line = reader.readNext()) != null) {
User u = new User();
u.setUsername(line[0]);
u.setPassword(passwordEncoder.encode(line[1])); // 必須加密存儲
list.add(u);
}
return list;
}
}
}
@Transactional
public void batchInsert(List<User> users) {
String sql = "INSERT INTO sys_user(username, password, create_time) VALUES (?, ?, NOW())";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, users.get(i).getUsername());
ps.setString(2, users.get(i).getPassword());
}
public int getBatchSize() { return users.size(); }
});
}
<table>
<c:forEach items="${userList}" var="u">
<tr><td>${u.username}</td><td>******</td></tr> <!-- 密碼不顯示明文 -->
</c:forEach>
</table>
「上傳 → 解析 → 入庫 → 展示」是 Java Web 經典場景。關鍵在於:多格式解析策略封裝、密碼加密、批次寫入優化、異常處理完備。新手建議先跑通 TXT/CSV → 再擴展 Excel/Word,循序漸進掌握各解析庫 API。