วิธีการอ่าน/เขียนข้อมูลใน Excel Selenium การใช้งาน Apache POI

⚡ สรุปอย่างชาญฉลาด

ไฟล์ Excel ไดรฟ์ Selenium การทดสอบที่ขับเคลื่อนด้วยข้อมูล และ Apache POI คือ Java ไลบรารีที่อ่านและเขียนข้อมูลเหล่านี้ หัวข้อด้านล่างจะกล่าวถึงการพึ่งพา คลาสหลัก ตัวอย่างการอ่านและการเขียน และ JXL

  • 🔘 มีสองรูปแบบ: คลาส HSSF จัดการไฟล์ .xls ส่วนคลาส XSSF จัดการไฟล์ .xlsx
  • อินเทอร์เฟซหลัก: สมุดงาน แผ่นงาน แถว และเซลล์ มีลักษณะคล้ายคลึงกับสเปรดชีต
  • 🧪 เร้ดดิ้ง: FileInputStream บวกกับ getLastRowNum จะวนลูปทุกแถวและทุกเซลล์
  • 🛠️ การเขียน: ใช้คำสั่ง createRow และ setCellValue เพื่อเพิ่มข้อมูล จากนั้นใช้คำสั่ง FileOutputStream เพื่อบันทึกข้อมูล
  • 📊 มรดก: JXL อ่านเวิร์กบุ๊กเก่าได้ แต่ไม่สามารถอ่านไฟล์ XLSX ได้

การอ่านและเขียนข้อมูล Excel Selenium ด้วย Apache POI

File IO เป็นส่วนสำคัญของกระบวนการซอฟต์แวร์ใดๆ เราสร้างไฟล์ เปิดและอัปเดตบางอย่างหรือลบไฟล์ในคอมพิวเตอร์ของเราบ่อยครั้ง เช่นเดียวกับกรณีของ Selenium ระบบอัตโนมัติ เราจำเป็นต้องมีกระบวนการในการจัดการไฟล์ด้วย Selenium.

Java ให้คลาสที่แตกต่างกันสำหรับการจัดการไฟล์ด้วย Selenium- ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีการอ่านและเขียน Excel ไฟล์ด้วยความช่วยเหลือของ Java แพ็คเกจ IO และ อาปาเช่ ห้องสมุดจุดที่น่าสนใจ

อาปาเช่ POI ใน Selenium

การขอ อาปาเช่ POI ใน Selenium เป็น API ที่ใช้กันอย่างแพร่หลายสำหรับ Selenium การทดสอบที่ขับเคลื่อนด้วยข้อมูลเป็นไลบรารี POI ที่เขียนด้วยภาษา... Java ที่ให้ API แก่ผู้ใช้สำหรับการจัดการ Microsoft เอกสารประเภท .xls และ .xlsx ผู้ใช้สามารถสร้าง แก้ไข และอ่าน/เขียนไฟล์ Excel ได้อย่างง่ายดาย POI ย่อมาจาก “Poor Obfuscation Implementation” (การใช้งานการปกปิดข้อมูลที่แย่)

วิธีจัดการไฟล์ Excel โดยใช้ POI (Dependency ใน Maven POM)

POI เชื่อมโยงไปยัง Selenium ทดสอบกับแบบฝึกหัดด้านล่าง

Apache POI ทำหน้าที่เป็นสะพานเชื่อมระหว่าง Selenium การทดสอบและสมุดงาน Excel

หากต้องการอ่านและเขียนไฟล์ Excel ใน JavaApache มีไลบรารี POI ที่มีชื่อเสียงมาก ไลบรารีนี้มีความสามารถในการอ่านและเขียนไฟล์ Excel ทั้งรูปแบบ XLS และ XLSX ได้อย่างมีประสิทธิภาพ

ไลบรารี POI มีการใช้งาน HSSF สำหรับอ่านไฟล์ XLS

ในการอ่านไฟล์ XLSX นั้น การใช้งาน XSSF ของไลบรารี POI จะเป็นตัวเลือกที่เหมาะสม เรามาศึกษาการใช้งานเหล่านี้อย่างละเอียดกัน

หากคุณใช้ Maven ในโปรเจ็กต์ของคุณ การเพิ่ม dependency ของ Maven จะถูกเพิ่มลงในไฟล์ pom.xml ดังแสดงด้านล่าง

เพิ่มรายการการพึ่งพา POI ลงในไฟล์ pom.xml ของโปรเจ็กต์ Maven

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

หมายเหตุเกี่ยวกับเวอร์ชัน: 4.1.1 คือตัวอย่างดั้งเดิม โครงการปัจจุบันประกาศว่า poi-ooxml 5.5.1 ซึ่งเป็นเวอร์ชันที่จำเป็นสำหรับไฟล์ XLSX

หรือคุณสามารถดาวน์โหลด POI jars เวอร์ชันล่าสุดได้จาก http://poi.apache.org/download.html & ดาวน์โหลดไฟล์ zip ล่าสุด

หน้าดาวน์โหลด Apache POI แสดงรายการไฟล์ไบนารีและซอร์สโค้ด

เมื่อคุณดาวน์โหลดไฟล์ zip สำหรับ Jar นี้ คุณจะต้องแตกไฟล์และเพิ่ม Jar ทั้งหมดเหล่านี้ลงในพาธคลาสของโปรเจ็กต์ของคุณ

ไฟล์ jar ของ POI ที่คลายซิปแล้วถูกเพิ่มเข้าไปใน Java เส้นทางการสร้างโปรเจ็กต์

คลาสและอินเทอร์เฟซใน POI

ต่อไปนี้เป็นรายการที่แตกต่างกัน Java อินเทอร์เฟซและคลาสใน POI สำหรับการอ่านไฟล์ XLS และ XLSX แสดงไว้ด้านล่าง

ลำดับชั้นของคลาส POI ตั้งแต่เวิร์กบุ๊กไปจนถึงชีต แถว และเซลล์

  • สมุด: คลาส XSSFWorkbook และ HSSFWorkbook ใช้ส่วนต่อประสานนี้
  • XSSFWorkbook: เป็นการแสดงไฟล์ XLSX ในรูปแบบคลาส
  • แบบฝึกหัด HSSF: เป็นการแสดงไฟล์ XLS ในรูปแบบคลาส
  • แผ่น: คลาส XSSFSheet และ HSSFSheet ใช้ส่วนต่อประสานนี้
  • XSSFSheet: เป็นคลาสที่ใช้แทนชีตในไฟล์ XLSX
  • HSSFSheet: เป็นคลาสที่ใช้แทนชีตในไฟล์ XLS
  • แถว: คลาส XSSFRow และ HSSFRow ใช้การใช้งานอินเทอร์เฟซนี้
  • XSSFRow: คลาสที่ใช้แทนแถวในชีตของไฟล์ XLSX
  • HSSFRow: คลาสนี้ใช้แทนแถวในชีตของไฟล์ XLS
  • มือถือ: คลาส XSSFCell และ HSSFCell ใช้การใช้งานอินเทอร์เฟซนี้
  • XSSFCell: เป็นคลาสที่ใช้แทนเซลล์ในแถวของไฟล์ XLSX
  • HSSFCเซลล์: เป็นคลาสที่แสดงเซลล์ในแถวของไฟล์ XLS

อ่านเขียน Operaการ

สำหรับตัวอย่างของเรา เราจะพิจารณารูปแบบไฟล์ Excel ที่ระบุด้านล่างนี้

ตัวอย่างไฟล์เวิร์กบุ๊ก ExportExcel พร้อม ExcelGuru99 เอกสารสาธิตที่ใช้ในตัวอย่างทั้งสอง

อ่านข้อมูลจากไฟล์ Excel

ตัวอย่างที่สมบูรณ์: ในที่นี้เรากำลังพยายามอ่านข้อมูลจากไฟล์ Excel Selenium:

package excelExportAndFileIO;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

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 ReadGuru99ExcelFile {

    public void readExcel(String filePath,String fileName,String sheetName) throws IOException{

    //Create an object of File class to open xlsx file

    File file =    new File(filePath+"\\"+fileName);

    //Create an object of FileInputStream class to read excel file

    FileInputStream inputStream = new FileInputStream(file);

    Workbook guru99Workbook = null;

    //Find the file extension by splitting file name in substring  and getting only extension name

    String fileExtensionName = fileName.substring(fileName.indexOf("."));

    //Check condition if the file is xlsx file

    if(fileExtensionName.equals(".xlsx")){

    //If it is xlsx file then create object of XSSFWorkbook class

    guru99Workbook = new XSSFWorkbook(inputStream);

    }

    //Check condition if the file is xls file

    else if(fileExtensionName.equals(".xls")){

        //If it is xls file then create object of HSSFWorkbook class

        guru99Workbook = new HSSFWorkbook(inputStream);

    }

    //Read sheet inside the workbook by its name

    Sheet guru99Sheet = guru99Workbook.getSheet(sheetName);

    //Find number of rows in excel file

    int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum();

    //Create a loop over all the rows of excel file to read it

    for (int i = 0; i < rowCount+1; i++) {

        Row row = guru99Sheet.getRow(i);

        //Create a loop to print cell values in a row

        for (int j = 0; j < row.getLastCellNum(); j++) {

            //Print Excel data in console

            System.out.print(row.getCell(j).getStringCellValue()+"|| ");

        }

        System.out.println();
    } 

    }  

    //Main function is calling readExcel function to read data from excel file

    public static void main(String...strings) throws IOException{

    //Create an object of ReadGuru99ExcelFile class

    ReadGuru99ExcelFile objExcelFile = new ReadGuru99ExcelFile();

    //Prepare the path of excel file

    String filePath = System.getProperty("user.dir")+"\\src\\excelExportAndFileIO";

    //Call read file method of the class to read data

    objExcelFile.readExcel(filePath,"ExportExcel.xlsx","ExcelGuru99Demo");

    }

}

หมายเหตุ เราไม่ได้ใช้ TestNG กรอบที่นี่ รันชั้นเรียนเป็น Java แอปพลิเคชันที่ใช้ฟังก์ชันอ่าน Excel ใน Selenium ดังตัวอย่างข้างต้น

จากนั้นคอนโซลจะพิมพ์ทุกแถวทีละเซลล์

เอาต์พุตคอนโซลแสดงแต่ละแถวในไฟล์ Excel โดยค่าในเซลล์คั่นด้วยเครื่องหมายไปป์ (|)

เขียนข้อมูลลงในไฟล์ Excel

ตัวอย่างที่สมบูรณ์: ในที่นี้เรากำลังพยายามเขียนข้อมูลจากไฟล์ Excel โดยการเพิ่มแถวใหม่ลงในไฟล์ Excel

package excelExportAndFileIO;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

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 WriteGuru99ExcelFile {

    public void writeExcel(String filePath,String fileName,String sheetName,String[] dataToWrite) throws IOException{

        //Create an object of File class to open xlsx file

        File file =    new File(filePath+"\\"+fileName);

        //Create an object of FileInputStream class to read excel file

        FileInputStream inputStream = new FileInputStream(file);

        Workbook guru99Workbook = null;

        //Find the file extension by splitting  file name in substring and getting only extension name

        String fileExtensionName = fileName.substring(fileName.indexOf("."));

        //Check condition if the file is xlsx file

        if(fileExtensionName.equals(".xlsx")){

        //If it is xlsx file then create object of XSSFWorkbook class

        guru99Workbook = new XSSFWorkbook(inputStream);

        }

        //Check condition if the file is xls file

        else if(fileExtensionName.equals(".xls")){

            //If it is xls file then create object of XSSFWorkbook class

            guru99Workbook = new HSSFWorkbook(inputStream);

        }    

    //Read excel sheet by sheet name    

    Sheet sheet = guru99Workbook.getSheet(sheetName);

    //Get the current count of rows in excel file

    int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum();

    //Get the first row from the sheet

    Row row = sheet.getRow(0);

    //Create a new row and append it at last of sheet

    Row newRow = sheet.createRow(rowCount+1);

    //Create a loop over the cell of newly created Row

    for(int j = 0; j < row.getLastCellNum(); j++){

        //Fill data in row

        Cell cell = newRow.createCell(j);

        cell.setCellValue(dataToWrite[j]);

    }

    //Close input stream

    inputStream.close();

    //Create an object of FileOutputStream class to create write data in excel file

    FileOutputStream outputStream = new FileOutputStream(file);

    //write data in the excel file

    guru99Workbook.write(outputStream);

    //close output stream

    outputStream.close();
	
    }

    public static void main(String...strings) throws IOException{

        //Create an array with the data in the same order in which you expect to be filled in excel file

        String[] valueToWrite = {"Mr. E","Noida"};

        //Create an object of current class

        WriteGuru99ExcelFile objExcelFile = new WriteGuru99ExcelFile();

        //Write the file using file name, sheet name and the data to be filled

        objExcelFile.writeExcel(System.getProperty("user.dir")+"\\src\\excelExportAndFileIO","ExportExcel.xlsx","ExcelGuru99Demo",valueToWrite);

    }

}

จากนั้นสมุดงานจะบันทึกแถวที่เพิ่มเข้ามา

ไฟล์ Excel หลังจากเพิ่มแถวใหม่ที่มีชื่อคุณ E และเมือง Noida แล้ว

การจัดการ Excel โดยใช้ JXL API

JXL เป็นอีกหนึ่งขวดที่มีชื่อเสียงในการอ่านไฟล์ Excel Java และการเขียนไฟล์ ปัจจุบัน POI ถูกใช้ในโครงการส่วนใหญ่ แต่ก่อน POI JXL เป็นเพียงเท่านั้น Java API สำหรับการจัดการ Excel เป็น API ขนาดเล็กและเรียบง่ายสำหรับการอ่าน Excel Selenium.

ไฟล์ JXL jar อยู่ในรายการไลบรารีของโปรเจ็กต์

คำแนะนำ: ผมขอแนะนำว่าอย่าใช้ JXL ในโปรเจกต์ใหม่ใดๆ เพราะไลบรารีนี้ไม่ได้มีการพัฒนาอย่างต่อเนื่องมาตั้งแต่ปี 2010 แล้ว โดยเวอร์ชันล่าสุดคือ 2.6.12 และยังขาดฟีเจอร์ต่างๆ เมื่อเทียบกับ POI API ด้วย

ดาวน์โหลด JXL:

หากคุณต้องการทำงานกับ JXL คุณสามารถดาวน์โหลดได้จากลิงค์นี้

https://sourceforge.net/projects/jexcelapi/files/jexcelapi/2.6.12/

คุณยังสามารถดูตัวอย่างสาธิตภายในไฟล์ซิปนี้สำหรับ JXL ได้อีกด้วย เนื่องจากตัวอย่างดังกล่าวtracเนื้อหาด้านล่างนี้แสดงรายละเอียดเพิ่มเติม

Extracไฟล์เก็บถาวร ted JXL แสดงโฟลเดอร์ jar, เอกสารประกอบ และโฟลเดอร์สาธิต

คุณสมบัติบางอย่าง:

  • JXL สามารถอ่านไฟล์ Excel ได้ Selenium สำหรับสมุดงาน 95, 97, 2000, XP, 2003
  • เราสามารถทำงานร่วมกับภาษาอังกฤษ ฝรั่งเศส สเปน เยอรมัน
  • สามารถคัดลอกแผนภูมิและการแทรกรูปภาพใน Excel ได้

ข้อเสียเปรียบ:

  • เราสามารถเขียนได้เฉพาะ Excel 97 ขึ้นไปเท่านั้น (ไม่รองรับการเขียนใน Excel 95)
  • JXL ไม่รองรับไฟล์ Excel รูปแบบ XLSX
  • มันสร้างสเปรดชีตในรูปแบบ Excel 2000

คำถามที่พบบ่อย

ประกาศ poi-ooxmlไม่ใช่แค่ poi อย่างเดียว มันดึง poi เข้ามาแบบต่อเนื่องและจัดหาคลาส XSSF ที่ XLSX ต้องการ เวอร์ชัน 5.5.1 คือเวอร์ชันปัจจุบัน

ส่วน OOXML ของ POI ขาดหายไปหรือไม่ตรงกัน เพิ่ม poi-ooxml และรักษาทุกอาร์ติแฟกต์ของ POI ไว้ในเวอร์ชันเดียว เนื่องจากเวอร์ชันที่ผสมกันจะทำให้คลาสสคีมาไม่อยู่ในเส้นทาง

เมธอด getStringCellValue ใช้ได้เฉพาะกับเซลล์ข้อความเท่านั้น หากต้องการอ่านค่าจากเซลล์ใดๆ ให้เป็นสตริง ให้ใช้ DataFormatter หรือตรวจสอบ getCellType แล้วเรียกใช้ FormulaEvaluator กับสูตรต่างๆ

หากไม่มีแถวหรือเซลล์ใดๆ จะส่งคืนค่า null ดังนั้นลูปจึงโยนข้อยกเว้น NullPointerException ควรตรวจสอบค่า null หรือ CellType.BLANK ก่อน หรือตั้งค่า MissingCellPolicy เพื่อให้เซลล์ว่างส่งคืนค่าเซลล์ว่างเปล่า

โมเดลการเรียนรู้ของเครื่องสร้างแถวข้อมูลที่สมจริง ระบุข้อมูลที่ซ้ำกัน และจัดอันดับว่าชุดข้อมูลใดแสดงข้อบกพร่องได้ดีที่สุด พร้อมทั้งตัดข้อมูลที่ไม่จำเป็นออกไป การทดสอบที่ขับเคลื่อนด้วยข้อมูล แผ่น.

นักบิน GitHub ร่างข้อความมาตรฐานสำหรับผู้อ่านและผู้เขียนจากความคิดเห็น Revตรวจสอบดู เพราะมักจะแนะนำค่าคงที่ประเภทเซลล์ที่ล้าสมัยจาก POI เวอร์ชันเก่าๆ

SXSSFWorkbook จะส่งข้อมูลแต่ละแถวไปยังดิสก์แทนที่จะเก็บเวิร์กบุ๊กไว้ในหน่วยความจำ ดังนั้นการส่งออกข้อมูลขนาดใหญ่จึงไม่เกิดข้อผิดพลาด OutOfMemoryError อีกต่อไป เมื่ออ่านข้อมูล ให้จัดการข้อมูลแต่ละแถวภายในลูป

เก็บไว้ในโฟลเดอร์ src/test/resources และสร้างพาธจาก System.getProperty(“user.dir”) พาธแบบสัมบูรณ์จะใช้งานไม่ได้เมื่อรันชุดทดสอบที่อื่นหรือบนเครื่องอื่น Jenkins ตัวแทน

สรุปโพสต์นี้ด้วย: