[Java] Đọc ghi file Excel trong Java với jxl – Read write Excel file in Java with jxl
Trong quá trinh làm việc và xử lý dữ liệu chúng ta thường phải tương tác với các file đặc biệt là File Excel. Hôm nay mình sẽ hướng dẫn các bạn các bước đơn giản để đọc ghi file Excel với jxl. Jxl là một gói thư viện cho phép chúng ta tương tác gới Excel như đọc, ghi,.., về thông tin chi tiết gói jxl các bạn xem tại đây.
Trước tiên các bạn download Jxl (hoặc tại đây), giải nén sau đó copy file *.jar vừa vào project, ấn chuột phải chọn Build Path / Add to Build Path để có thể sử dụng thư viện này. Bây giờ chúng ta lần lượt tìm hiểu:
Cách tạo và ghi file Excel với Jxl
Cách đọc file Excel với Jxl
Cách mở và ghi tiếp file Excel đã có với Jxl
Code minh họa
Tạo và ghi file Excel với Jxl
Bước 1: Tạo đối tượng WritableWorkbook “trỏ” đến file của bạn. Lưu ý là nếu file của bạn đã tồn tại thì nó sẽ bị xóa đi và tạo lại.
WritableWorkbook workbook = Workbook.createWorkbook(new File(fileName));
Bước 2: Tạo WritableSheet – sheet bạn cần ghi dữ liệu:
WritableSheet sheet = workbook.createSheet("name sheet", 0);
Lưu ý: trong hàm createSheet có 2 đối số, đối số thứ nhất là chuỗi tên sheet, đối số thứ 2 là một số nguyên chỉ vị trí của sheet, vị trí sheet bắt đầu bằng 0.
Bước 3: Tiếp theo chúng ta sẽ thêm các dạng dữ liệu vào các ô bằng phương thức addCell. Để viết dữ liệu vào các ô, chúng ta sẽ có 3 dạng chính: Chuỗi, Số và Công thức lần lượt được tạo bằng Label, Number, Formula. Ví dụ:
sheet.addCell(new Label(0, 0, "Add a String to cell")); // add a String to cell A1 sheet.addCell(new Number(0, 1, 100)); // add number 100 to cell A2 sheet.addCell(new Formula(0, 3, "IF(A1=1,"one", "two")")); // add number 100 to cell A3
Bước 4: Sau khi chúng ta đã thực hiện xong bước 3, chúng ta cần thực hiện lệnh write và close để hoàn tất việc ghi dữ liệu
workbook.write(); workbook.close();
Đọc file Excel với Jxl
Bước 1: Tạo Workbook “trỏ” đến file của bạn.
Workbook workbook = Workbook.getWorkbook(new File(fileName));
Bước 2: Lấy Sheet bạn muốn đọc. Bạn có thể lấy theo vị trí sheet hoặc tên Sheet
Sheet sheet = workbook.getSheet(0);
Bước 3: Đọc nội dung từng ô trong bảng tính. Nếu bạn muốn lấy nội dung của một ô nào đó bạn có thể làm như sau: sheet.getCell(col, row).getContents(). Tuy nhiên nếu bạn muốn đọc toàn bộ các ô trong bảng tính hãy lấy hàng và cột cuối cùng chứa dữ liệu bằng sheet.getRows() và sheet.getColumns(), và dùng vòng lặp for để đọc từng ô. Sau khi đọc xong, chúng ta cũng cần close workbook như khi viết dữ liệu
for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { Cell cell = sheet.getCell(col, row); System.out.print(cell.getContents() + "t"); } System.out.println("n"); } workbook.close();
Mở và ghi thêm dữ liệu vào Excel với Jxl
Để mở và ghi thêm dữ liệu vào file Excel, trước tiên chúng ta cần lấy Workbook từ file Excel cần viết thêm giống như khi chúng ta đọc. Sau đó tạo một WritableWorkbook đến chính workbook vừa lấy và chúng ta sẽ làm việc với WritableWorkbook này bình thường.
Workbook workbook = Workbook.getWorkbook(new File(fileName)); WritableWorkbook writeWorkbook = Workbook.createWorkbook(new File(fileName), workbook);
Demo code
package vietSource.net.IOFile; import java.io.File; import java.io.IOException; import java.util.Scanner; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import jxl.write.Formula; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; /** * ----------------- @author nguyenvanquan7826 ----------------- * ---------------nguyenvanquan7826.wordpress.com -------------- */ public class ReadWriteExcel { private final String fileName = "/home/nguyenvanquan7826/Desktop/nguyenvanquan7826.xls"; // data to write file private Object[][] data = { { "STT", "Họ và tên", "Điểm", "Xếp loại" }, { "1", "Nguyễn Văn Quân", "9.0", "" }, { "2", "Phạm Thị Hà", "8.0", "" }, { "3", "Nguyễn Bá Cường", "8.5", "" }, { "4", "Vũ Công Tịnh", "9.0", "" }, { "5", "Phạm Trọng Khang", "8", "" }, { "6", "Mai Văn Tài", "8", "" } }; // create and write new file *.xls private void writeFileExcel() { WritableWorkbook workbook; // create workbook try { workbook = Workbook.createWorkbook(new File(fileName)); // create sheet WritableSheet sheet1 = workbook.createSheet("KTPM K10B", 0); // create Label and add to sheet sheet1.addCell(new Label(0, 0, "DANH SÁCH SINH VIÊN TIÊU BIỂU")); // row begin write data int rowBegin = 2; int colBegin = 0; for (int row = rowBegin, i = 0; row < data.length + rowBegin; row++, i++) { for (int col = colBegin, j = 0; col < data[0].length + colBegin; col++, j++) { Object obj = data[i][j]; sheet1.addCell(new Label(col, row, (String) data[i][j])); } } // write file workbook.write(); // close workbook.close(); } catch (IOException e) { System.out.println("Error create file\n" + e.toString()); } catch (RowsExceededException e) { System.out.println("Error write file\n" + e.toString()); } catch (WriteException e) { System.out.println("Error write file\n" + e.toString()); } System.out.println("create and write success"); } // open and read file *.xls private void readFileExcel() { Workbook workbook; try { // create workbook to open file workbook = Workbook.getWorkbook(new File(fileName)); // get sheet want read Sheet sheet = workbook.getSheet(0); // get number row and col contain data int rows = sheet.getRows(); int cols = sheet.getColumns(); System.out.println("Data in file:"); // read data in each cell for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { Cell cell = sheet.getCell(col, row); System.out.print(cell.getContents() + "\t"); } System.out.println("\n"); } // close workbook.close(); } catch (BiffException e) { System.out.println("File not found\n" + e.toString()); } catch (IOException e) { System.out.println("File not found\n" + e.toString()); } } // open and write file is exists private void openAndWriteFileExcel() { Workbook workbook; WritableWorkbook writeWorkbook; try { // open file workbook = Workbook.getWorkbook(new File(fileName)); // create file copy of root file to write file writeWorkbook = Workbook.createWorkbook(new File(fileName), workbook); // get sheet to write WritableSheet sheet1 = writeWorkbook.getSheet(0); int col = 3; int rowBegin = 3; // write data (formula) for (int row = rowBegin; row < data.length + rowBegin - 1; row++) { Formula f = new Formula(col, row, "IF(C" + (row + 1) + ">8, \"Xuất sắc\", \"Giỏi\")"); sheet1.addCell(f); } writeWorkbook.write(); // close writeWorkbook.close(); } catch (IOException e) { System.out.println("File not found\n" + e.toString()); } catch (RowsExceededException e) { System.out.println("File not found\n" + e.toString()); } catch (WriteException e) { System.out.println("File not found\n" + e.toString()); } catch (BiffException e) { System.out.println("File not found\n" + e.toString()); } System.out.println("open and write success"); } private void showMenu() { System.out.println(); System.out.println("Select an integer for process:"); System.out.println("1 - Create new file and wrire data"); System.out.println("2 - Read file exits"); System.out.println("3 - Open and write to file exits"); } public static void main(String[] args) { ReadWriteExcel rwExcel = new ReadWriteExcel(); while (true) { rwExcel.showMenu(); Scanner scan = new Scanner(System.in); int select = Integer.parseInt(scan.nextLine()); switch (select) { case 1: rwExcel.writeFileExcel(); break; case 2: rwExcel.readFileExcel(); break; case 3: rwExcel.openAndWriteFileExcel(); break; default: scan.close(); break; } } } }
Đọc thêm (read more): Java Excel API Tutorial
Cho emhỏi khi dùng chức năng read Excel. Khi lấy dữ liệu ra thì dữ liệu tiếng việt vị lỗi font
ví dụ: Lê Dũng => Lê D?ng
Anh có thể giúp em cách giải quyết được không !:D
Mình đọc vẫn ngon mà :D, viết cũng ngon luôn.
Search qua thì họ bảo set thế này. Bạn thử làm xem được không, nếu không có thể dùng một thư viện khác nhưng khó dùng hơn tý là POI
thử cài đặt font với jxl:
Thanks anh! em làm được rồi 😀
Bạn dùng cách mình đưa ra hay cách nào vậy?
cái đoạn code này thêm ở đâu vậy ad??
Đây chỉ là code đọc ghi thôi, bạn ứng dụng vào đâu thì tùy bạn nhé.
Anh cho em hỏi là khi dùng chức năng read excel thì phạm thị hà thì đọc được nhưng hà không thì lại bị lỗi “h�” chữ trung bình cũng bị lỗi như thế này “trung b�nh”
Bạn thử cài đặt font như ở đây xem nhé
https://www.cachhoc.net/2014/06/20/java-doc-ghi-file-excel-trong-java-voi-jxl-read-write-excel-file-in-java-with-jxl/#comment-1439
Dear anh Quân.
Anh Quâ cho em hỏi vì sao máy em không import được jxl.write.Label, mặc dù các cái khác thì import được, em kiểm tra trong library cũng đã có Label.class rồi ?
Cái này mình không rõ. Bạn viết thẳng ra xem đk ko
Anh cho em hỏi, em muốn hiện file Excel trên giao diện thì làm như thế nào ạ. Chẳng hạn đối với file tex thì dùng JTextArea, còn Excel thì em chưa biết. Anh chỉ giúp em với. Em cảm ơn ạ.
Cái này mình cũng chưa thử bao giờ bạn ah.
Anh tìm hiểu ra thì anh bảo em biết với ạ, em đang cần xử lý vấn đề này gấp, không biết hỏi ai. Em cảm ơn anh nhiều.
neu da doc duoc du lieu ben trong tung cell thi co the dua du lieu vua doc duoc vao o cua JTable
Đúng rồi bạn
Chào anh! em có đề bài như thế này:Viết chương trình có chức năng hỗ trợ cùng soạn thảo tài liệu trực tuyến dưới dạng bảng tính(giống google sheet). anh có thể chỉ cho em cần tìm hiểu về vấn đề gì để có thể làm được, bằng java. em xin cảm ơn
Cái này hơi khó nhưng bạn có thể tìm hiểu bảng trong java.
bảng trong java thì em biết rồi nhưng vấn đề ở đây là làm sao để có thể quản lý được các ô trên bảng khi mà nhiều người có thể thao tác cùng lúc trên bảng. vì khỏang mấy giây là mình phải lưu nhật ký làm việc.
thế thì cứ khi lưu nhật ký thì update nó hoặc nếu không thì khi họ lưu hoặc load lại thì mình load lại những thay đổi của tất cả mọi người. Nhưng phải đảm bảo hành động của mỗi người đều được lưu lại.
em định tổ chức lưu trử kiểu như file nhật ký trong hệ quản trị csdl vậy. nhưng có điều khi truy xuất thì sẽ khó khăn trong việc kiểm tra nhật ký file vì các cilent có thể làm việc trên nhiều ô. khả quan hơn là định tổ chức lưu nhật ký trực tiếp vào từng file excel. sau đó muốn kiểm tra thì chỉ việc gọi lên. dù sao củng cảm ơn a đã cho ý kiến
Mình nghĩ là nên lưu theo file.
em đã tổ chức lưu theo file nhưng gặp rắc rối ở chổ là làm sao để sau 5 hay 10 giây thì nó tự động lưu xuống. vì làm theo cách của e là khoảng 5 -10s là hiện thông báo bắt người dùng lưu lại, điều này sẽ gây bất tiện . anh có cách nào giải quyết chỉ e với
Có thể dùng 1 tiến trình chạy ngầm để lưu. Đọc thêm về Thread nhé
em làm được rồi! cảm ơn a
tot
Nếu mình ghi lần 3,4 ,5… thì sao bạn. Khi file đã tồn tại .
Thì mình có nói bên trên rồi mà. Phần mở và ghi thêm đó bạn.
Bác ơi cho e hỏi đây là cách xuất ra file exel với dữ liệu nhập bằng tay, thế nếu là dữ liệu sau khi mình chạy chương trình từ console mà muốn xuất ra exel thì ntn ạ?
Thì chạy console, nhập lưu vào biến sau đó ghi bình thường
Hi Quân,
Cho mình hỏi khai báo trong Java như thế nào để Set được độ rộng của mỗi cột trong Excel khi viết ra là fit với dữ liệu.
Thanks,
Can Nguyen
Mình cũng chưa tìm hiểu cái này, bạn thử google xem, nếu có mong bạn cập nhật lại cách làm ở đây cho mọi người nhé.
có thể thao tác file excel nhưng trong file excel là kiểu hình thì có thể thao tác như kiểu chuỗi được không vậy A ?