API tốt hơn để đọc trang tính Excel trong java là gì - JXL hoặc Apache POI [đã đóng]


94

API nào trong 2 API đọc / ghi / chỉnh sửa trang tính excel đơn giản hơn? Các API này không hỗ trợ tiện ích mở rộng CSV?

Sử dụng JXL cho file.xls và file.xlsx, tôi nhận được một ngoại lệ như:

jxl.read.biff.BiffException: Unable to recognize OLE stream
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
    at jxl.read.biff.File.<init>(File.java:127)
    at jxl.Workbook.getWorkbook(Workbook.java:268)
    at core.ReadXLSheet.contentReading(ReadXLSheet.java:46)
    at core.ReadXLSheet.init(ReadXLSheet.java:22)
    at core.ReadXLSheet.main(ReadXLSheet.java:72)

Cả cho phần mở rộng .xls và .xlsx. Phiên bản Java tôi đang sử dụng là: JDK1.6


1
Còn về: "Có những API nào để đọc / ghi bảng tính Microsoft Excel (JXL, Apache POI, v.v.) trong Java? Tình huống tốt nhất để sử dụng từng bảng trong số chúng là gì?"
Cléssio Mendes

Câu trả lời:


258

Tôi đã sử dụng cả JXL (bây giờ là "JExcel") và Apache POI . Lúc đầu tôi sử dụng JXL, nhưng bây giờ tôi sử dụng Apache POI.

Đầu tiên, đây là những thứ mà cả hai API đều có chức năng cuối giống nhau:

  • Cả hai đều miễn phí
  • Kiểu ô: căn chỉnh, nền (màu và mẫu), đường viền (loại và màu), hỗ trợ phông chữ (tên phông chữ, màu, kích thước, đậm, nghiêng, gạch ngang, gạch chân)
  • Công thức
  • Siêu liên kết
  • Các vùng ô được hợp nhất
  • Kích thước của hàng và cột
  • Định dạng dữ liệu: Số và Ngày
  • Gói văn bản trong ô
  • Panes đóng băng
  • Hỗ trợ đầu trang / chân trang
  • Đọc / Viết bảng tính hiện có và bảng tính mới
  • Cả hai đều cố gắng giữ nguyên vẹn các đối tượng hiện có trong bảng tính mà chúng đọc càng nhiều càng tốt.

Tuy nhiên, có nhiều điểm khác biệt:

  • Có lẽ sự khác biệt đáng kể nhất là Java JXL không hỗ trợ định dạng Excel 2007+ ".xlsx"; nó chỉ hỗ trợ định dạng BIFF (nhị phân) ".xls" cũ. Apache POI hỗ trợ cả hai với một thiết kế chung.
  • Ngoài ra, phần Java của API JXL được cập nhật lần cuối vào năm 2009 (3 năm, 4 tháng trước khi tôi viết phần này), mặc dù có vẻ như có API C #. Apache POI được duy trì tích cực.
  • JXL không hỗ trợ Định dạng có điều kiện, Apache POI thì có, mặc dù điều này không quá quan trọng, vì bạn có thể định dạng có điều kiện các ô bằng mã của riêng mình.
  • JXL không hỗ trợ định dạng văn bản đa dạng thức, tức là các định dạng khác nhau trong một chuỗi văn bản; Apache POI không hỗ trợ nó.
  • JXL chỉ hỗ trợ một số cách xoay văn bản nhất định: ngang / dọc, +/- 45 độ và xếp chồng lên nhau; Apache POI hỗ trợ bất kỳ số nguyên độ nào cộng với xếp chồng lên nhau.
  • JXL không hỗ trợ vẽ hình dạng; Apache POI thì có.
  • JXL hỗ trợ hầu hết các cài đặt Thiết lập Trang như Ngang / Chân dung, Lề, Khổ giấy và Thu phóng. Apache POI hỗ trợ tất cả những điều đó cộng với các hàng và cột lặp lại.
  • JXL không hỗ trợ Ngăn chia; Apache POI thì có.
  • JXL không hỗ trợ tạo hoặc thao tác biểu đồ; hỗ trợ đó chưa có trong Apache POI, nhưng một API đang dần bắt đầu hình thành.
  • Apache POI có sẵn một bộ tài liệu và ví dụ phong phú hơn JXL.

Ngoài ra, POI không chỉ chứa API "usermodel" chính mà còn chứa API dựa trên sự kiện nếu tất cả những gì bạn muốn làm là đọc nội dung bảng tính.

Kết luận, vì tài liệu tốt hơn, nhiều tính năng hơn, phát triển tích cực và hỗ trợ định dạng Excel 2007+, tôi sử dụng Apache POI.


Cảm ơn vì lời giải thích tỉ mỉ.
Swagatika

8
+1 để rõ ràng, ngắn gọn và cực kỳ hữu ích
Ron

1
getContents()phương thức dơ bẩn trong JExcelAPI giúp tôi tiết kiệm rất nhiều thời gian. Với POI, bạn phải kiểm tra loại ô đó, sau đó lấy giá trị của nó (nếu là ô Số, bạn cần kiểm tra xem đó có phải là ô Ngày hay không) theo loại của nó và cuối cùng chuyển đổi nó thành giá trị Chuỗi bằng các phương thức khác nhau, điều đó thật bất tiện. Không thể tưởng tượng POI không cung cấp một phương pháp bẩn nhưng tiện lợi như JExcelAPI.
LiuYan 刘 研

1
Một điều rất tích cực nếu POI là bài đọc dựa trên sự kiện. Đặc biệt là trên thiết bị di động (= Android), điều này giúp ích rất nhiều khi xử lý kích thước heap và GC hạn chế. Việc đọc một XLS đơn giản với JXL thường đạt đến giới hạn bộ nhớ ứng dụng, khiến ứng dụng bị lỗi.
dermatthias

2
Một trong những yếu tố quan trọng khiến tôi chuyển sang POI là sự linh hoạt khi sử dụng steam API, điều bắt buộc khi bạn muốn đọc excel với lượng dữ liệu khổng lồ. Bạn sẽ không muốn dữ liệu wole được tải vào bộ nhớ khi bạn mở excel, nếu dữ liệu trong excel rất lớn. Với tính năng phát trực tuyến, toàn bộ nội dung của excel / bất kỳ tài liệu văn phòng nào của bạn sẽ không được tải vào bộ nhớ ngay sau khi bạn phân tích cú pháp trang tính.
Ashok Koyi

12

Tôi đã sử dụng POI.

Nếu bạn sử dụng nó, hãy để ý các bộ định dạng ô đó: tạo một cái và sử dụng nó nhiều lần thay vì tạo mỗi lần cho ô, đó là sự khác biệt lớn về mức tiêu thụ bộ nhớ hoặc dữ liệu lớn.


5

Tôi không quen với JXL và chúng tôi sử dụng POI. POI được duy trì tốt và có thể xử lý cả định dạng .xls nhị phân và định dạng dựa trên xml mới được giới thiệu trong Office 2007.

Tệp CSV không phải là tệp excel, chúng là tệp dựa trên văn bản, vì vậy các thư viện này không đọc chúng. Bạn sẽ cần tự phân tích cú pháp tệp CSV. Tôi không biết bất kỳ thư viện tệp CSV nào, nhưng tôi cũng chưa xem.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.