So sánh EasyExcel và Apache Fesod: khác biệt thật nằm ở đâu?
Nếu bạn đang chọn thư viện đọc/ghi Excel cho Java, hai cái tên sẽ được nhắc tới nhiều nhất là EasyExcel của Alibaba và Apache Fesod. Trên mạng có không ít bài so sánh hai thư viện này với những con số hiệu năng rất ấn tượng, nhưng phần lớn không đưa ra mã nguồn để kiểm chứng. Bài này so sánh theo cách khác: chỉ dùng những gì đối chiếu được trong mã nguồn, pom.xml và changelog của hai dự án, ở phiên bản EasyExcel 4.0.3 và Fesod 2.0.2-incubating.

Hai thư viện cùng một dòng máu
Điều đầu tiên cần biết trước khi so sánh: Fesod không phải đối thủ được viết từ đầu để cạnh tranh với EasyExcel. Nó là hậu duệ trực tiếp của EasyExcel:
EasyExcel (
com.alibaba.excel): thư viện của Alibaba, nổi tiếng nhờ đọc file lớn theo luồng SAX mà không OOM. Bản cuối 4.0.3 phát hành tháng 9/2024. Ngày 4/9/2025, README chính thức thông báo dự án chuyển sang chế độ bảo trì: chỉ sửa lỗi, không thêm tính năng, và khuyến khích người dùng đánh giá các giải pháp khác.FastExcel (
cn.idev.excel): tác giả gốc của EasyExcel tiếp tục phát triển dưới tên mới. Bản 1.0 dùng giấy phép MIT, từ 1.2.0 chuyển sang Apache 2.0; đến 1.3.0 đã thêm khá nhiều API mới.Apache Fesod (Incubating) (
org.apache.fesod.sheet): FastExcel được tặng cho Apache Software Foundation và đổi tên (“fast easy spreadsheet and other documents”). Đã ra 2.0.0, 2.0.1, 2.0.2 trong năm 2026 và đang ở vòng RC của 2.1.0.
Vì vậy, ở phần lõi hai thư viện giống hệt nhau: cùng dựa trên Apache POI, cùng đọc .xlsx bằng SAX, cùng ghi bằng SXSSF, cùng mô hình @ExcelProperty + ReadListener, cùng yêu cầu tối thiểu Java 8. Khác biệt thật nằm ở vòng đời dự án, phiên bản phụ thuộc và những API được thêm sau khi tách nhánh.
Bảng so sánh nhanh
Tình trạng phát triển — EasyExcel: bảo trì, chỉ sửa lỗi. Fesod: phát triển tích cực dưới quy trình Apache, phát hành đều.
Giấy phép — cả hai đều Apache 2.0. Fesod có thêm quy trình kiểm tra IP của ASF (NOTICE ghi nhận nguồn gốc từ EasyExcel).
Java tối thiểu — cả hai: Java 8. Fesod chạy CI tới JDK 25.
Apache POI bên dưới — EasyExcel: 5.2.5. Fesod: 5.5.1 (nhận các bản vá bảo mật và sửa lỗi mới hơn của POI).
API cơ bản — giống nhau:
read()/write(),sheet(),doRead()/doWrite(),PageReadListener,ExcelWriter, template fill.API chỉ có ở Fesod —
numRows(),ignoreHiddenSheet(),autoStrip(), buildercsv()riêng,headerMergeStrategy(),registerReadListenerIfNotNull(), handler sắp thứ tự sheet, handler escape chuỗi hex, hookafterSheetDispose.Độ bền — Fesod thêm fuzz testing hằng ngày cho bộ đọc, xử lý êm file BIFF rất cũ thay vì ném lỗi khó hiểu, quét CodeQL, và chính sách URL scheme khi tải ảnh (2.0.2).
Hiệu năng — cùng engine; không có benchmark chính thức nào cho thấy bên nào nhanh hơn đáng kể.
API cơ bản: giống nhau đến mức nào?
// EasyExcel 4.0.3
EasyExcel.read(in, UserRow.class, new PageReadListener<UserRow>(userService::saveAll, 500))
.sheet().doRead();
EasyExcel.write(out, UserRow.class).sheet("Users").doWrite(rows);
// Apache Fesod 2.0.2 — chỉ khác tên lớp entry và package import
FesodSheet.read(in, UserRow.class, new PageReadListener<UserRow>(userService::saveAll, 500))
.sheet().doRead();
FesodSheet.write(out, UserRow.class).sheet("Users").doWrite(rows);Toàn bộ annotation (@ExcelProperty, @ExcelIgnore, @DateTimeFormat, @NumberFormat, @ContentLoopMerge…), các Converter, WriteHandler và cơ chế fill template đều được giữ nguyên. Fesod thậm chí vẫn có lớp EasyExcel (đã @Deprecated) để code cũ biên dịch được sau khi đổi package. Kiến thức, tài liệu và câu trả lời StackOverflow về EasyExcel áp dụng gần như trọn vẹn cho Fesod.
Những gì Fesod có mà EasyExcel không có
Đọc: giới hạn số dòng, bỏ sheet ẩn, cắt khoảng trắng
Ba tuỳ chọn nhỏ nhưng giải quyết các yêu cầu rất thường gặp: xem trước file trước khi import, bỏ qua sheet ẩn mà người dùng vô tình gửi kèm, và làm sạch khoảng trắng dư (kể cả ký tự trắng Unicode mà trim() bỏ sót).
// Xem trước 20 dòng đầu (numRows tính cả dòng tiêu đề) để người dùng
// kiểm tra mapping cột trước khi import thật — EasyExcel không có tuỳ chọn này
List<UserRow> preview = FesodSheet.read(file.getInputStream())
.head(UserRow.class)
.numRows(20)
.ignoreHiddenSheet(true) // bỏ qua các sheet bị ẩn
.autoStrip(true) // cắt khoảng trắng đầu/cuối, kể cả ký tự trắng Unicode
.sheet()
.doReadSync();CSV: builder riêng thay vì cấu hình thủ công
EasyExcel đọc được CSV, nhưng muốn đổi dấu phân cách hay ký tự quote thì phải tự dựng CSVFormat của commons-csv rồi gán vào ReadWorkbook. Fesod đưa các tuỳ chọn hay dùng lên builder:
// CSV xuất từ hệ thống châu Âu: dấu chấm phẩy, có quote
// EasyExcel: phải tự dựng CSVFormat rồi gán vào ReadWorkbook
// Fesod: builder riêng cho CSV
FesodSheet.read(in, UserRow.class, new PageReadListener<UserRow>(userService::saveAll, 500))
.csv()
.delimiter(";")
.quote('"')
.nullString("NULL")
.doRead();Ghi: kiểm soát cách gộp tiêu đề nhiều tầng
// Tiêu đề hai tầng: "Quý 1" trải ngang trên "Doanh thu" và "Chi phí"
public class ReportRow {
@ExcelProperty({"Quý 1", "Doanh thu"}) private BigDecimal q1Revenue;
@ExcelProperty({"Quý 1", "Chi phí"}) private BigDecimal q1Cost;
@ExcelProperty({"Quý 2", "Doanh thu"}) private BigDecimal q2Revenue;
@ExcelProperty({"Quý 2", "Chi phí"}) private BigDecimal q2Cost;
}
// EasyExcel chỉ có công tắc automaticMergeHead(true/false).
// Fesod cho chọn cách gộp: NONE, HORIZONTAL_ONLY, VERTICAL_ONLY, FULL_RECTANGLE
FesodSheet.write(out, ReportRow.class)
.headerMergeStrategy(HeaderMergeStrategy.HORIZONTAL_ONLY)
.sheet("Report")
.doWrite(rows);Ngoài ra Fesod có WriteSheetWorkbookWriteHandler để sắp thứ tự sheet, EscapeHexCellWriteHandler để tránh chuỗi dạng hex bị Excel diễn giải sai, và hook afterSheetDispose trong SheetWriteHandler để dọn tài nguyên sau mỗi sheet.
Độ bền với file xấu
Với ứng dụng nhận file do người dùng tải lên, đây là điểm đáng giá hơn mọi API mới. Fesod chạy fuzz testing hằng ngày cho XlsxSaxAnalyser và bộ đọc CSV, xử lý êm các file BIFF quá cũ, và bám sát POI 5.5.x. EasyExcel dừng ở POI 5.2.5 và, theo thông báo bảo trì, sẽ không nâng cấp lớn nữa.
Hiệu năng: đừng tin con số không có mã nguồn

Vì hai thư viện dùng chung đường đi — SAX khi đọc, SXSSF khi ghi — nên tiêu thụ bộ nhớ và tốc độ của chúng phụ thuộc vào cách bạn viết listener và cách bạn truy vấn dữ liệu, chứ không phụ thuộc vào việc bạn chọn thư viện nào. Gom hết dòng vào một List thì cả hai đều OOM; xử lý theo lô thì cả hai đều chạy ổn với hàng triệu dòng.
Nếu bạn gặp bài viết khẳng định Fesod nhanh gấp 3 lần và chỉ tốn 1/8 bộ nhớ so với EasyExcel, hãy hỏi mã benchmark ở đâu. Không có so sánh chính thức nào như vậy từ hai dự án. Muốn có số liệu cho hệ thống của mình, hãy tự đo: cùng một file, cùng JVM, cùng listener, chạy JFR để xem heap và thời gian GC. Kết quả khả năng cao là xấp xỉ nhau, và phần chênh lệch (nếu có) đến từ phiên bản POI.
Chi phí chuyển đổi
<!-- EasyExcel: bản cuối 4.0.3 (09/2024), POI 5.2.5 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.3</version>
</dependency>
<!-- Apache Fesod: 2.0.2-incubating (05/2026), POI 5.5.1, vẫn Java 8+ -->
<dependency>
<groupId>org.apache.fesod</groupId>
<artifactId>fesod-sheet</artifactId>
<version>2.0.2-incubating</version>
</dependency>Chuyển từ EasyExcel sang Fesod là thao tác cơ học: đổi dependency, đổi package com.alibaba.excel → org.apache.fesod.sheet, đổi EasyExcel → FesodSheet. Các lớp tiện ích chuyển sang module fesod-common. Fesod có sẵn recipe OpenRewrite cho FastExcel, sửa lại tên package nguồn là dùng được cho EasyExcel. Với dự án cỡ vừa, việc này mất một buổi, chủ yếu là chạy lại bộ test import/export.
Nên chọn gì?
Dự án mới: dùng Fesod. Không có lý do gì để bắt đầu với một thư viện đã ngừng thêm tính năng.
Dự án đang chạy ổn với EasyExcel, ít thay đổi: chưa cần vội. EasyExcel vẫn được sửa lỗi; hãy lên kế hoạch chuyển trong lần nâng cấp phụ thuộc kế tiếp, nhất là khi POI có bản vá bảo mật mà EasyExcel không kịp theo.
Dự án nhận file từ người dùng bên ngoài: chuyển sớm. Fuzz testing, POI mới và cách xử lý file lỗi của Fesod giảm rủi ro rõ rệt.
Đang cần numRows, csv() hay headerMergeStrategy: chuyển ngay, vì EasyExcel sẽ không bổ sung những API này.
Bị ràng buộc bởi chính sách chỉ dùng bản phát hành ổn định: lưu ý Fesod còn mang hậu tố
-incubating(dự án đang ươm tạo tại Apache, chưa tốt nghiệp). Mã nguồn thì trưởng thành, nhưng nhãn này có thể vướng quy định ở một số tổ chức.
Tóm lại, so sánh EasyExcel và Fesod không phải là so sánh hai kiến trúc, mà là so sánh hai giai đoạn của cùng một thư viện: một bản đã đóng băng và một bản đang tiếp tục. Chọn Fesod vì tương lai của dự án và những tiện ích mới, chứ đừng chọn vì tin rằng nó nhanh hơn gấp nhiều lần.
Nguồn đối chiếu: README và update.md của EasyExcel (github.com/alibaba/easyexcel), mã nguồn, pom.xml, CHANGELOG và release notes của Fesod (github.com/apache/fesod), tài liệu fesod.apache.org, và maven-metadata trên Maven Central.
Site Admin
Engineer and writer. Building things with TypeScript and distributed systems.
Bình luận (0)
Bạn cần đăng nhập bằng Google để bình luận.
Hãy là người bình luận đầu tiên.


