Bạn đang xem bài viết Sử Dụng Apache Poi Để Đọc, Ghi Dữ Liệu Từ File Excel Trong Selenium được cập nhật mới nhất trên website Hoisinhvienqnam.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.
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
Các bước thực hiện download Apache POI
1. Truy cập link: https://poi.apache.org/download.html
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:
Vậy là xong bước download bộ thư viện Apache POI.
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
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:
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:
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:
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:
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
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:
8. Để lấy ra giá trị của ô trong file excel ta có thể gọi method getStringCellValue() trong cell class:
5. Ghi dữ liệu vào file excel trong Selenium Webdriver
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:
8. Thực hiện gán giá trị cho cell đó bằng cách sử dụng method setCellValue() trong Cell Class:
9. Tạo đối tượng để lưu thông tin file output với FileOutputStream :
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:
Để đọ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.
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) { } } }Đọc Ghi File Excel Bằng Java Sử Dụng Apache Poi
Đọc ghi file Excel bằng Java sử dụng Apache POI
Apache POI là một thư viện mã nguồn mở cung cấp bởi apache được sử dụng để xử lý các file office như word, excel, powerpoint…
1.1 Xử lý file Excel với Apache POI
Apache POI xử lý các thành phần trong excel theo đúng lập trình hướng đối tượng – mỗi thành phần trong Excel đều được coi như 1 đối tượng.
Các class cơ bản được dùng để đọc ghi file Excel
HSSF: các class có tên bắt đầu là HSSF được dùng để sử lý các file Microsoft Excel 2003 (.xls)
XSSF: các class có tên bắt đầu là XSSF được dùng để sử lý các file Microsoft Excel 2007 trở về sau (.xlsx)
XSSFWorkbook và HSSFWorkbook là các class xử lý với Excel Workbook
HSSFSheet và XSSFSheet là các class xử lý với Excel Worksheet
Row: định nghĩa một dòng trong excel
Cell: định nghĩa một ô trong excel
Ở đây mình sử dụng maven để lấy thư viện của Apache POI.
Cho các file Microsoft Excel 2003
Cho các file Microsoft Excel 2007 trở về sau
3.1 Ghi file Excel
Tạo 1 Worksheet có name là “Customer_Info”
dòng đầu tiên hiển thị “List Of Customer”
Các dòng tiếp theo hiển thị các thông tin của customer (id, name, email), mỗi thông tin ở 1 column.
package stackjava.com.apachepoiexcel.demo; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class WriteFileExcel { public static void main(String[] args) { System.out.println("Create file excel"); XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("Customer_Info"); int rowNum = 0; Row firstRow = sheet.createRow(rowNum++); Cell firstCell = firstRow.createCell(0); firstCell.setCellValue("List of Customer"); listOfCustomer.add(new Customer(1, "Sylvester Stallone", "abc@gmail.com")); listOfCustomer.add(new Customer(2, "Tom Cruise", "xyz@yahoo.com")); listOfCustomer.add(new Customer(3, "Vin Diesel", "abc@hotmail.com")); for (Customer customer : listOfCustomer) { Row row = sheet.createRow(rowNum++); Cell cell1 = row.createCell(0); cell1.setCellValue(customer.getId()); Cell cell2 = row.createCell(1); cell2.setCellValue(customer.getName()); Cell cell3 = row.createCell(2); cell3.setCellValue(customer.getEmail()); } try { FileOutputStream outputStream = new FileOutputStream("Demo-ApachePOI-Excel.xlsx"); workbook.write(outputStream); workbook.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("Done"); } } package stackjava.com.apachepoiexcel.demo; public class Customer { private int id; private String name; private String email; }Kết quả:
Bây giờ mình sẽ thực hiện đọc lại file Excel vừa tạo ở trên:
package stackjava.com.apachepoiexcel.demo; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadFileExcel { public static void main(String[] args) { try { FileInputStream excelFile = new FileInputStream(new File("Demo-ApachePOI-Excel.xlsx")); Workbook workbook = new XSSFWorkbook(excelFile); Sheet datatypeSheet = workbook.getSheetAt(0); DataFormatter fmt = new DataFormatter(); Row firstRow = iterator.next(); Cell firstCell = firstRow.getCell(0); System.out.println(firstCell.getStringCellValue()); while (iterator.hasNext()) { Row currentRow = iterator.next(); Customer customer = new Customer(); customer.setId(Integer.parseInt(fmt.formatCellValue(currentRow.getCell(0)))); customer.setName(currentRow.getCell(1).getStringCellValue()); customer.setEmail(currentRow.getCell(2).getStringCellValue()); listOfCustomer.add(customer); } for (Customer customer : listOfCustomer) { System.out.println(customer); } workbook.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }*Lưu ý: id của customer là integer nên khi ghi vào file excel nó sẽ là kiểu numeric, do đó khi đọc ra thì nó sẽ đọc là numeric và chuyển thành double, ví dụ 1 sẽ là 1.0. Do đó ta dùng DataFormatter để định dạng nó về kiểu string và parse lại thành integer.
Kết quả:
List of Customer Customer [id=1, name=Sylvester Stallone, email=abc@gmail.com] Customer [id=2, name=Tom Cruise, email=xyz@yahoo.com] Customer [id=3, name=Vin Diesel, email=abc@hotmail.com]Okay, Done!
Đọc ghi file Excel bằng Java sử dụng Apache POI
Reference:
Đọc Dữ Liệu Từ File Excel
I. Mở đầu
Mình ít khi sử dụng đến cách làm này, nên cóp nhặt trên mạng đoạn code này, bạn nào dùng có thể copy thẳng vào trong project.
Yêu cầu:
Giải nén và add các tất cả các file jar vào project ngoại trừ log4j.
Lưu ý là phải add cả những file jar ở trong folder /lib/ và /ooxml-lib/
II. Class đọc file Excel
Mình đặt cái class này ở trong package utilities.
Trong class có 3 method chính:
setExcelFile: Đọc file và xác định data ở sheet nào trong file excel
findCells: Tìm vị trí các cell có chứa data trong sheet
getTestData: Lấy data và lưu vào các array
III. Cách inject data vào trong các test method
1. Cấu trúc file Excel
File Excel phù hợp với Class trên có dạng như sau:
2. Cách lấy đường dẫn đến file linh hoạt
File data nên được đặt trong project luôn, đừng để ở vị trí nào đó ở trên máy ngoài project vì nếu có ai đó làm chung với bạn thì đường dẫn đến file sẽ bị sai. Tất nhiên là đường dẫn đến project ở mỗi máy lại khác nhau nên chúng ta phải có cách để dynamic cái đường dẫn đó để lúc nào cũng đúng dù ở bất kỳ máy nào.
Cái File.separator chính là cái ký tự “” hoặc “/”, sẽ tùy vào hệ điều hành để hiển thị.
3. Thực hiện việc đọc file excel vào lúc nào?
Tùy vào mục đích sử dụng để xác định thời điểm đọc file Excel:
Đọc file 1 lần và sẽ run trước tất cả các test
Test nào cần data thì chỉ đọc file ở test đó.
Class test Login sẽ như sau:
Trong đó: sử dụng annotation DataProdiver của TestNG để làm việc inject data vào trong method test.
Một số điểm lưu ý:
Nếu cái dataProdiver method mà bạn đặt ở Class khác thì trên chỗ method Test bạn cần phải khai báo cái class chứa method DataProvider.
Bắt buộc cái method Test phải có parameter trùng với số cột được định nghĩa trong file excel (ko tính 2 cái từ ở góc dùng để đánh dấu). Giả sử cái file data có thêm 1 cột nữa là email thì ở trong Method Test cũng phải có thêm parameter Email
Không nên định nghĩa pass/fail ở trong file data vì 2 TH pass và fail sẽ có cách check kết quả khác nhau
Càng không nên lưu pass/fail ra file excel vì bạn đã có 1 cái report của TestNG rồi, giờ còn phải mò mẫm vào file excel để xem kết quả pass fail thì quá khổ.
Và đây là kết quả sau khi run test, mình chỉ làm demo nên giá trị đầu vào nó ko đúng với tiêu chí test lắm.
Thao Tác Với Excel File Bằng Apache Poi
Khi lập trình với bất cứ hệ thống nào thì việc thao tác với các file excel luôn là điều bắt buộc mọi developer phải nắm được. Và để làm việc hiệu quả với excel file trong java thì tôi xin giới thiệu thư viện Apache POI trong bài viết này. POI là viết tắt của Poor Obfuscation Implementation, đó là một thư viện mã nguồn mở của Java, được cung cấp bởi Apache giúp chúng ta làm việc với các tài liệu của Microsoft như Word, Excel, PowerPoint…
Để thao tác với các file Excel thì POI cung cấp cho chúng ta các khái niệm chính sau:
Workbook: Đây là khái niệm đại diện cho một bảng tính, hay một file Excel.
Sheet: tương đương với các sheet trong file Excel, một workbook có thể có một hoặc nhiều sheet.
Row: đơn vị hàng trong một bảng tính
Cell: đại diện cho một cột trong bảng tính. Như vậy mỗi một ô trong file Excel sẽ được biểu diễn bằng một row và một cell.
Để làm việc với Excel thì chúng ta không cần quan tâm đến tất cả các class trong thư viện POI mà chỉ cần để ý đến 2 loại sau:
Các class có tiếp đầu ngữ là HSSF (Horrible SpreadSheet Format) : Các class giúp đọc và ghi file dang Microsoft Excel (XLS – dạng excel cũ). Ví dụ: HSSFWorkbook, HSSFSheet, HSSFCellStyle,…
Các class có tiếp đầu ngữ là XSSF (XML SpereadSheet Format) : Đọc và ghi định dạng file Open Office XML (XLSX – dạng excel mới).
Nếu bạn sử dụng Maven thì cần thêm dependency của POI vào file pom.xml:
Còn Gradle thì thêm vào build.gradle:
compile "org.apache.poi:poi:3.17"Trước tiên, ta tạo một class model để có thể ghi các ra các row theo một List data:
public class Employee { private String name; private String email; private Date dateOfBirth; private double daysOfWork; private double salaryPerDay; private Double totalSalary; public Employee(String name, String email, Date dateOfBirth, double daysOfWork, double salaryPerDay, Double totalSalary) { chúng tôi = name; this.email = email; this.dateOfBirth = dateOfBirth; this.daysOfWork = daysOfWork; this.salaryPerDay = salaryPerDay; this.totalSalary = totalSalary; }Tiếp đến chuẩn bị data raw để ghi vào file excel:
Sau các bước chuẩn bị data, chúng ta tạo một workbook:
Có workbook rồi chúng ta tạo tiếp một sheet trong đó:
Có thể thêm một chút màu sắc font bạt cho đẹp mắt:
Font headerFont = workbook.createFont(); headerFont.setBold(true); headerFont.setFontHeightInPoints((short) 14); headerFont.setColor(IndexedColors.RED.getIndex());Sau đó chúng ta tạo row đầu tiên chứa các tiêu đề của các cột:
Do trong phần model của chúng ta có loại dữ liệu khác đặc biệt là Date (dateOfBirth) nên chúng ta cần một format cho nó:
Tiếp đến là công việc chính, set data vào các ô trong file excel:
Chú ý rằng cột cuối cùng ta dùng công thức để tính tổng lương của mỗi nhân viên nên CellType ở đây sẽ là FORMULA.
Cuối cùng là ghi tất cả ra một file Excel thật và kết thúc việc tạo một file Excel:
Nội dung file employee.xlsx sẽ như sau:
Để đọc một file Excel có sẵn, đầu tiên chúng ta cũng tạo một workbook cho file đó:
Duyệt các sheet trong một workbook:
Vì trong file excel ta vừa tạo chỉ có một sheet nên chúng ta sẽ get nó ra như sau:
Để duyệt các row trong sheet, ta làm như sau:
Sau khi duyệt xong nhớ đóng workbook lại:
Màn hình console sẽ trông như sau:
Từ đây ta có thể nhận thấy đối với kiểu là FORMULA thì khi in ra chúng ta sẽ nhận được công thức của field đó chứ không phải giá trị cuối cùng. Để nhận các giá trị cuối cùng của field thì chúng ta viết thêm hàm sau:
private static Object getCellValue(Cell cell, FormulaEvaluator evaluator) { CellValue cellValue = evaluator.evaluate(cell); switch (cellValue.getCellTypeEnum()) { case BOOLEAN: return cellValue.getBooleanValue(); case NUMERIC: return cellValue.getNumberValue(); case STRING: return cellValue.getStringValue(); case BLANK: return ""; case ERROR: return cellValue.getError(cell.getErrorCellValue()).getStringValue();Với một cell có kiểu FORMULA bạn có thể in ra công thức của nó và sử dụng FormulaEvaluator để tính toán giá trị của ô cho bởi công thức đó. Sau đó sửa lại đoạn duyệt row như sau:
Kết quả nhận được sẽ như sau:
Để sửa một file Excel thì chúng ta cũng làm tương tự đọc một file Excel. Đầu tiên là tạo một workbook cho nó và một sheet tương ứng:
Workbook workbook = WorkbookFactory.create(new File("./employee.xlsx");Xác định vị trí cần update lại và định vị nó. Cần chú ý nếu vị trí cần update chưa được tạo thì cần khởi tạo field đó trước, nếu không chương trình sẽ throw một Exception:
Update lại định dạng và giá trị của field đó:
Output ra một file Excel khác và đóng workbook:
https://github.com/tubean/apache-poi-tutorial.git
https://www.callicoder.com/java-write-excel-file-apache-poi/https://www.callicoder.com/java-read-excel-file-apache-poi/
Cập nhật thông tin chi tiết về Sử Dụng Apache Poi Để Đọc, Ghi Dữ Liệu Từ File Excel Trong Selenium trên website Hoisinhvienqnam.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!