Sử dụng Apache POI để đọc, ghi dữ liệu từ file Excel trong Selenium

928

Bài viết được sự cho phép của tác giả Tô Thị Vân Anh

Chúng ta đều biết rằng, trong mỗi môi trường phát triển phần mềm, dữ liệu là một phần không thể thiếu. Khi phát triển, chúng ta thường lưu trữ dữ liệu trực tiếp trong các file chương trình, mỗi khi có sự thay đổi nào đó liên quan trực tiếp đến dữ liệu trong các file đó thì bắt buộc phải thực hiện biên dịch code và kiểm tra lại các kết quả biên dịch đó.

  Các kiểu “đợi chờ” trong Selenium Webdriver: Implicit wait, Explicit wait và Fluent wait
  Làm quen: Tóm tắt cơ bản về Selenium

Vậy thì vấn đề đặt ra ở đây là, nếu như dữ liệu cần phải thay đổi nhiều lần, liên tục và hàng ngày thì chúng ta sẽ thực hiện thay đổi từng phần theo mỗi lần thay đổi đó và rồi lại biên dịch lại? Chỉ nghĩ thôi đã thấy khá là mệt mỏi rồi, chưa kể đến việc biên dịch lỗi và ngồi mần lại thì đúng là ác mộng.

Thế nên trải qua rất nhiều kinh nghiệm xương máu, người ta và người tây đã rút ra được rằng, việc phát triển code tốt nhất là nên tách rời với phần dữ liệu để khi hoạt động chúng không ảnh hưởng đến nhau đến các file chương trình. Đưa dữ liệu ra ngoài các file code của chương trình chính là cách duy nhất để làm việc đó, chúng ta có thể đưa dữ liệu vào trong các file excel, property file, config file, Json file, hay các XML file…

1. Về Apache POI

Apache POI giúp Java/ các công nghệ liên quan đến Java có thể đọc và ghi các file excel trên nhiều nền tảng khác nhau. Sử dụng Apache POI chúng ta có thể thực hiện các thao tác đọc, ghi trên cả định dạng file .xls hay .xlsx. Apache POI là một công cụ mã nguồn mở được cung cấp bởi apache.

Apache POI sẽ rất hữu ích khi thực hiện sửa đổi một lượng lớn nội dung dữ liệu. Dưới đây là các bước thực hiện download và sử dụng Apache POI nhé.

Các bước thực hiện download Apache POI

1. Truy cập link: https://poi.apache.org/download.html

2. Click vào link theo thứ tự như các hình phía dưới:

Sử dụng Apache POI để đọc, ghi dữ liệu từ file Excel trong Selenium

Sử dụng Apache POI để đọc, ghi dữ liệu từ file Excel trong Selenium

Sử dụng Apache POI để đọc, ghi dữ liệu từ file Excel trong Selenium

3. Lưu file zip về máy tính, sau đó giải nén ta được một folder và các thông tin tương tự như hình dưới:

Sử dụng Apache POI để đọc, ghi dữ liệu từ file Excel trong Selenium

Vậy là xong bước download bộ thư viện Apache POI.

Nếu bạn sử dụng Maven thì có thể sử dụng đoạn mã dưới này, thêm vào trong nội dung file POM là được nhé:

<dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi</artifactId>
         <version>4.0.0</version>
</dependency>

2. Tích hợp Apache POI và Selenium Webdriver

Chúng ta có thể sử dụng tích hợp Apache POI trong Selennium Webdriver để thực hiện đọc và ghi file excel và tạo một data drivent framework.

Các bước để thực hiện tích hợp Apache POI với project Selenium webdriver:

1. Mở project selenium webdriver trên Eclipse

2. Nhấn chuột phải vào tên project và chọn Properties > Java build path 

3. Nhấn vào nút Add External jars

4. Thực hiện điều hướng đến thư mục chứa Apache POI vừa giản nén, chọn các file jars trong thư mục chính, các file jar trong thư mục lib, và trong thư mục ooxml-lib:

Sử dụng Apache POI để đọc, ghi dữ liệu từ file Excel trong Selenium

5. Nhấn nút OK > Hoàn tất việc thêm Apache POI vào trong project.

6. Để kiểm tra việc thêm này đã thành công hay chưa, ta có thể gõ thử từ khóa Workbook sau đó nhấn tổ hợp Ctrl + Space để xem gợi ý, nếu nó hiển thị tương tự như hình phía dưới thì bạn có thể sử dụng thoải mái nhé! 😀

Sử dụng Apache POI để đọc, ghi dữ liệu từ file Excel trong Selenium

3. Một số thuật ngữ quan trọng thường dùng trong Apache POI

Thư viện của Apache POI xoay quanh 4 từ khóa quen thuộc trong một file excel:

Workbook: 1 workbook đại diện cho 1 file excel

Sheet: 1 workbook có thể bao gồm nhiều sheet, chúng ta có thể truy cập vào các sheet này dựa theo tên hoặc chỉ số (index) của sheet đó trong workbook.

Row: như tên gọi của nó, đại diện cho một hàng của 1 sheet.

Cell: một cell sẽ đại diện cho một ô trong sheet.

4. Đọc dữ liệu file excel với Apache POI

Trước tiên chúng ta sẽ cùng thực hiện đọc dữ liệu từ 1 file excel và in ra màn hình nội dung đó.

1. Tạo project, và class trong Eclipse

2. Tạo 1 file excel có tên là testData.xlsx, có 1 sheet tên là Sheet1 và nội dung của ô A1 = Hello. Lưu lại trong một thư mục ở máy tính của bạn.

3. Tạo một đối tượng cho FileInputStream chứa đường dẫn đến nơi lưu trữ file data excel:

FileInputStream fis = new FileInputStream("C:\\pathX\\data.xlsx");

4. Tạo đối tượng workbook bằng cách sử dụng method  create() trong WorkbookFactory class và truyền vào đó tham số đầu vào là đối tượng fis file excel ta vừa tạo ở bước 3:

Workbook wb = WorkbookFactory.create(fis);

5. Tạo đối tượng sheet từ đối tượng workbook (wb) vừa tạo ở bước 4, ở đây ta sẽ truyền tham số đầu vào chính xác tên của sheet trong file excel ta đã chuẩn bị ở bước 2 là Sheet1: 

Sheet sheet = wb.getSheet("Sheet1");

6. Tạo đối tượng Row từ sheet vừa có ở bước 5, tham số đầu vào là chỉ số hàng – bắt đầu từ 0

Row row = sheet.getRow(0);

7. Ta cũng có thể tạo 1 đối tượng cell từ đối tượng row ở bước 6, tham số đầu vào ở đây cũng là chỉ số cell:

Cell cell = row.getCell(0);

8. Để lấy ra giá trị của ô trong file excel ta có thể gọi method getStringCellValue() trong cell class:

System.out.println(cell.getStringCellValue());

5. Ghi dữ liệu vào file excel trong Selenium Webdriver

Ta cũng thực hiện các bước 1, 2, 3, 4, 5, 6 tương tự như thao tác đọc dữ liệu để khởi tạo đầu vào file excel liên quan đến: Workbook, sheet, row.

FileInputStream fis = new FileInputStream("C:\\pathX\\data-write.xlsx");
Workbook wb = WorkbookFactory.create(fis);
Sheet sheet = wb.getSheet("Sheet1");
Row row = sheet.getRow(0);

7. Tạo một cell thuộc row với tham số đầu vào là chỉ số của cell muốn thêm:

Cell cell = row.createCell(0);

8. Thực hiện gán giá trị cho cell đó bằng cách sử dụng method setCellValue() trong Cell Class:

cell.setCellValue("Written by apache poi");

9. Tạo đối tượng để lưu thông tin file output với FileOutputStream :

FileOutputStream fos = new FileOutputStream("C:\\pathX\\data-write.xlsx");

10. Method write() sẽ giúp chúng ta thực hiện lưu thông tin giá trị vừa gán vào trong file với đối tượng fos:

wb.write(fos);

Vậy là xong rồi đó :D, ngoài ra các bạn cũng có thể tham khảo thêm tại đây nhé.

Trên đây là mấy bước và mấy hàm cơ bản để chúng ta làm quen với Apache POI và Excel trong Selnium. Và tất nhiên với những bài toán cụ thể thì nó sẽ chẳng thể nào đơn giản từng dòng, từng chữ như ví dụ trên này được. Nó có thể có rất nhiều các dòng, cột dữ liệu, yêu cầu ta cần phải xử lý tỉ mỉ, chi tiết hơn rất nhiều. 😀

Để đọc thì đơn giản là ta sẽ cần sử dụng vòng lặp for với biến i,j tương ứng cho hàng và cột cứ thế thì sẽ ra thôi. Kaka. Nói thì dễ nhưng làm rồi mới thấy dễ hơn =)))

Thông thường, đọc và ghi dữ liệu file excel mình sẽ viết thành một hàm và cho nó vào 1 file common nào đó, khi nào cần thì sẽ gọi ra và dùng thôi.

Các bạn có thể tham khảo đoạn phía dưới này về hàm đọc và ghi dữ liệu excel của mình, nếu có vấn đề gì cần trao đổi hay góp ý các bạn thoải mái để lại phía dưới bình luận nhé!

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelCommon_POI {
	private static XSSFSheet ExcelWSheet;
	private static XSSFWorkbook ExcelWBook;
	private static XSSFCell Cell;
		
	public static XSSFSheet setExcelFile(String Path, String SheetName) throws Exception {
		try {
			FileInputStream ExcelFile = new FileInputStream(Path);
			ExcelWBook = new XSSFWorkbook(ExcelFile);
			ExcelWSheet = ExcelWBook.getSheet(SheetName);
		} catch (Exception e) {
			throw (e);
		}
		return ExcelWSheet;
	}
	public static String getCellData(int RowNum, int ColNum, XSSFSheet excelWSheet) throws Exception {
		try {
			Cell = excelWSheet.getRow(RowNum).getCell(ColNum);
			String CellData = Cell.getStringCellValue();
			return CellData;
		} catch (Exception e) {
			return "";
		}
	}
	public static void writeDataToExcel(int rowcount, int columncount, String filepath, String Sheetname, String value) {
		try {
			FileInputStream input = new FileInputStream(filepath);
			XSSFWorkbook wb = new XSSFWorkbook(input);
			XSSFSheet sh = wb.getSheet(Sheetname);
			XSSFRow row = sh.getRow(rowcount);
			FileOutputStream webdata = new FileOutputStream(filepath);
			row.createCell(columncount).setCellValue(value);
			wb.write(webdata);
		} catch (Exception e) {			
		}	    
	}
}
Bài viết gốc được đăng tải tại vananhtooo.wordpress.com
Có thể bạn quan tâm:
Xem thêm Việc làm Developer hấp dẫn trên TopDev