كيفية قراءة/كتابة بيانات Excel Selenium استخدام Apache POI

⚡ ملخص ذكي

محرك ملفات إكسل Selenium الاختبارات القائمة على البيانات، وApache POI هو Java مكتبة لقراءة وكتابة هذه البيانات. تتناول الأقسام التالية التبعية، والفئات الأساسية، وأمثلة القراءة والكتابة، وJXL.

  • 🔘 صيغتين: تتعامل فئات HSSF مع ملفات .xls، بينما تتعامل فئات XSSF مع ملفات .xlsx.
  • ✅ الواجهات الأساسية: تُحاكي عناصر Workbook و Sheet و Row و Cell جدول البيانات.
  • 🧪 قراءة: تقوم الدالة FileInputStream بالإضافة إلى getLastRowNum بتكرار كل صف وخلية.
  • 🛠️ جاري الكتابة: تقوم الدالة createRow و setCellValue بإلحاق البيانات، ثم تقوم الدالة FileOutputStream بحفظها.
  • 📊 ميراث: يقرأ برنامج JXL المصنفات القديمة ولكنه لا يقرأ ملفات XLSX.

قراءة وكتابة بيانات Excel في Selenium مع Apache POI

يعد File IO جزءًا مهمًا من أي عملية برمجية. نقوم في كثير من الأحيان بإنشاء ملف وفتحه وتحديث شيء ما أو حذفه من أجهزة الكمبيوتر لدينا. نفس الشيء هو الحال مع Selenium أتمتة. نحن بحاجة إلى عملية للتعامل مع الملفات Selenium.

Java يوفر لنا فئات مختلفة لمعالجة الملفات Selenium. في هذا البرنامج التعليمي، سوف نتعلم كيف يمكننا القراءة والكتابة Excel ملف بمساعدة Java حزمة IO و Apache مكتبة النقاط المهمة.

أباتشي النقاط المهمة في Selenium

استخدم أباتشي النقاط المهمة في Selenium واجهة برمجة تطبيقات (API) شائعة الاستخدام لـ Selenium اختبار يعتمد على البياناتهي مكتبة نقاط الاهتمام مكتوبة بلغة البرمجة التالية: Java الذي يمنح المستخدمين واجهة برمجة التطبيقات (API) للتلاعب Microsoft مستندات مثل ملفات .xls و .xlsx. يمكن للمستخدمين إنشاء ملفات Excel وتعديلها وقراءتها/كتابتها بسهولة. POI اختصار لـ "تطبيق التعتيم الضعيف".

كيفية التعامل مع ملفات Excel باستخدام POI (تبعية Maven POM)

روابط نقاط الاهتمام أ Selenium اختبر المصنف أدناه.

نقطة اهتمام أباتشي تعمل كجسر بين Selenium اختبار وملف إكسل

لقراءة وكتابة ملف Excel في Javaتوفر أباتشي مكتبة POI الشهيرة جدًا. هذه المكتبة قادرة على قراءة وكتابة ملفات Excel بصيغتي XLS و XLSX.

لقراءة ملفات XLS، يتم توفير تطبيق HSSF بواسطة مكتبة POI.

لقراءة ملفات XLSX، يُفضّل استخدام تطبيق XSSF لمكتبة POI. دعونا ندرس هذه التطبيقات بالتفصيل.

إذا كنت تستخدم Maven في مشروعك، فسيتم إضافة تبعية 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 وقم بتنزيل أحدث ملف مضغوط

صفحة تنزيل Apache POI التي تعرض أرشيفات توزيع الملفات الثنائية والمصدرية

عندما تقوم بتنزيل الملف المضغوط لهذه الجرة، ستحتاج إلى فك ضغطه وإضافة كل هذه الجرار إلى مسار الفصل الدراسي لمشروعك.

تمت إضافة ملفات POI jar التي تم فك ضغطها إلى Java مسار بناء المشروع

الفئات والواجهات في النقاط المهمة

فيما يلي قائمة مختلفة Java الواجهات والفئات في مكتبة POI لقراءة ملفات XLS و XLSX، موضحة أدناه-

التسلسل الهرمي لفئات POI من المصنف وصولاً إلى الورقة والصف والخلية

  • المصنف: تُنفذ فئتا XSSFWorkbook وHSSFWorkbook هذه الواجهة.
  • XSSFWorkbook: هو تمثيل فئوي لملف XLSX.
  • كتاب عمل HSSF: هو تمثيل فئوي لملف XLS.
  • ورقة: تُنفذ فئتا XSSFSheet وHSSFSheet هذه الواجهة.
  • XSSFSheet: هل هي فئة تمثل ورقة في ملف XLSX؟
  • ورقة بيانات HSSF: هل هو صنف يمثل ورقة في ملف XLS؟
  • صف: تُنفذ فئتا XSSFRow و HSSFRow هذه الواجهة.
  • XSSFRow: هل يمثل هذا الصنف صفًا في ورقة ملف XLSX؟
  • HSSFRow: هل هو صنف يمثل صفًا في ورقة ملف XLS؟
  • الخلية: تُنفذ فئتا XSSFCell و HSSFCell هذه الواجهة.
  • XSSFell: هل هي فئة تمثل خلية في صف من ملف XLSX؟
  • HSSFCell: هي فئة تمثل خلية في صف من ملف XLS.

قراءة و كتابة Operaالإنتاج

على سبيل المثال، سننظر أدناه في تنسيق ملف Excel المحدد

نموذج لتصدير مصنف Excel باستخدام ExcelGuruورقة العرض التوضيحي 99 المستخدمة في كلا المثالين

قراءة البيانات من ملف 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 التطبيق باستخدام وظيفة قراءة التفوق في Selenium كما هو موضح في المثال أعلاه.

ثم تقوم وحدة التحكم بطباعة كل صف، خلية تلو الأخرى.

مخرجات وحدة التحكم تعرض كل صف من صفوف 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 باستخدام JXL API

JXL هو أيضًا وعاء مشهور آخر لقراءة ملف Excel فيه Java وكتابة الملفات . في الوقت الحاضر، يتم استخدام POI في معظم المشاريع، ولكن قبل POI، كان JXL فقط Java API لمعالجة Excel. إنها واجهة برمجة تطبيقات صغيرة جدًا وبسيطة لقراءة Excel Selenium.

ملف JXL jar مدرج ضمن مكتبات المشروع

نصائح: اقتراحي هو عدم استخدام JXL في أي مشروع جديد لأن المكتبة لم تعد قيد التطوير النشط منذ عام 2010 - الإصدار 2.6.12 هو أحدث إصدار لها - وتفتقر إلى الميزات مقارنةً بـ POI API.

تحميل جي اكس ال:

إذا كنت تريد العمل مع 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 تنسيق XLSX لملف Excel.
  • يقوم بإنشاء جدول بيانات بتنسيق Excel 2000.

الأسئلة الشائعة

أعلن poi-ooxmlلا يقتصر الأمر على نقاط الاهتمام فقط، بل يقوم بجلبها بشكل غير مباشر وتوفير فئات XSSF التي يحتاجها ملف XLSX. الإصدار الحالي هو 5.5.1.

جانب OOXML من POI مفقود أو غير متوافق. أضف poi-ooxml واحتفظ بجميع عناصر POI على إصدار واحد، لأن الإصدارات المختلطة تُخرج فئات المخطط من المسار.

لا تعمل دالة getStringCellValue إلا مع الخلايا النصية. استخدم DataFormatter لقراءة أي خلية كسلسلة نصية، أو تحقق من getCellType واستدعِ FormulaEvaluator على الصيغ.

في حال فقدان صف أو خلية، تُرجع الدالة قيمة فارغة (null)، لذا تُطلق الحلقة استثناء NullPointerException. تحقق أولاً من وجود قيمة فارغة (null) أو نوع الخلية (CellType.BLANK)، أو عيّن سياسة MissingCellPolicy بحيث تُرجع الخلايا الفارغة خلايا فارغة.

تُنشئ نماذج التعلم الآلي صفوفًا واقعية، وتُحدد التكرارات، وتُرتب المجموعات التي تُظهر العيوب بشكل أفضل، مع تقليل البيانات المُضخمة. اختبار يعتمد على البيانات ملاءات.

مساعد الطيار جيثب مسودة نموذجية للقارئ والكاتب مأخوذة من تعليق. Revانظر إليه، لأنه غالبًا ما يقترح ثوابت نوع الخلية المهملة من إصدارات POI الأقدم.

يقوم SXSSFWorkbook ببث الصفوف إلى القرص بدلاً من الاحتفاظ بالمصنف في الذاكرة، لذا تتوقف عمليات التصدير الكبيرة عن إظهار خطأ نفاد الذاكرة. عند القراءة، تعامل مع الصفوف داخل الحلقة.

احتفظ به ضمن src/test/resources وقم بإنشاء المسار من System.getProperty(“user.dir”). تتعطل المسارات المطلقة عند تشغيل مجموعة الاختبارات في مكان آخر أو على Jenkins وكيل.

تلخيص هذه التدوينة بـ: