مرحبًا بك في دورة تعليم Apache POI. في بعض الأحيان، نحتاج إلى قراءة البيانات من ملفات Microsoft Excel أو نحتاج إلى إنشاء تقارير بتنسيق Excel، غالبًا لأغراض الأعمال أو التمويل. لا توفر Java دعمًا مدمجًا للعمل مع ملفات Excel، لذا يتعين علينا البحث عن واجهات برمجة تطبيقات مفتوحة المصدر لهذه المهمة. عندما بدأت في البحث عن واجهات برمجة تطبيقات Java لـ Excel، أوصى معظم الناس باستخدام JExcel أو Apache POI. وبعد بحث أعمق، اكتشفت أن Apache POI هو الخيار الأمثل للأسباب الرئيسية التالية.
- الدعم من مؤسسة Apache.
- JExcel لا تدعم تنسيق xlsx بينما تدعم POI كل من تنسيقي xls و xlsx.
- توفير Apache POI لمعالجة البيانات بشكل مستند إلى التدفق، مما يجعله مناسبًا للملفات الكبيرة ويتطلب ذاكرة أقل.
Apache POI
توفير Apache POI لدعم ممتاز للعمل مع مستندات Microsoft Excel. يستطيع Apache POI التعامل مع تنسيقات جداول البيانات XLS و XLSX. بعض النقاط الهامة حول واجهة برمجة التطبيقات Apache POI هي:
- تحتوي Apache POI على تنفيذ HSSF لتنسيق ملفات Excel ’97(-2007) أي XLS.
- يجب استخدام تنفيذ Apache POI XSSF لتنسيق ملفات Excel 2007 OOXML (.xlsx).
- توفير واجهة برمجة التطبيقات Apache POI HSSF و XSSF آليات لقراءة أو كتابة أو تعديل جداول البيانات في Excel.
- توفر Apache POI أيضًا واجهة برمجة التطبيق SXSSF التي هي امتداد لـ XSSF للعمل مع أوراق Excel كبيرة جدًا. تتطلب واجهة SXSSF أقل ذاكرة وهي مناسبة عند العمل مع جداول Excel كبيرة جدًا وتكون ذاكرة الكثيب محدودة.
- هناك نموذجان للاختيار من بينهما – نموذج الحدث ونموذج المستخدم. يتطلب نموذج الحدث أقل ذاكرة لأن ملف Excel يتم قراءته على شكل رموز ويتطلب معالجتها. نموذج المستخدم هو نموذج موجه نحو الكائن وسهل الاستخدام وسنستخدمه في أمثلتنا.
- توفر Apache POI دعمًا ممتازًا لميزات إضافية في Excel مثل العمل مع الصيغ وإنشاء أنماط الخلية عن طريق ملء الألوان والحدود والخطوط والرؤوس والتذييل والتحقق من البيانات والصور والروابط المرجعية وما إلى ذلك.
تبعيات Maven لـ Apache POI
إذا كنت تستخدم Maven ، فأضف التبعيات التالية لـ Apache POI.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
الإصدار الحالي لـ Apache POI هو 3.10-FINAL. إذا كنت تستخدم تطبيق Java مستقل ، قم بتضمين ملفات JAR من الصورة أدناه.
مثال Apache POI – قراءة ملف Excel
لنفترض أن لدينا ملف Excel بعنوان “Sample.xlsx” يحتوي على ورقتين ويحتوي على البيانات كما في الصورة أدناه. نريد قراءة ملف Excel وإنشاء قائمة بالبلدان. ورقة Sheet1 تحتوي على بعض البيانات الإضافية التي سنتجاهلها أثناء تحليلها.
كودنا لكائن البلد هو:
Country.java
package com.journaldev.excel.read;
public class Country {
private String name;
private String shortCode;
public Country(String n, String c){
this.name=n;
this.shortCode=c;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getShortCode() {
return shortCode;
}
public void setShortCode(String shortCode) {
this.shortCode = shortCode;
}
@Override
public String toString(){
return name + "::" + shortCode;
}
}
مثال برنامج Apache POI لقراءة ملف Excel وتحويله إلى قائمة بالبلدان يبدو على النحو التالي. ReadExcelFileToList.java
package com.journaldev.excel.read;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
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 ReadExcelFileToList {
public static List readExcelData(String fileName) {
List countriesList = new ArrayList();
try {
//إنشاء تيار الإدخال من ملف xlsx / xls
FileInputStream fis = new FileInputStream(fileName);
//إنشاء مثيل Workbook لتيار الإدخال من ملف xlsx / xls
Workbook workbook = null;
if(fileName.toLowerCase().endsWith("xlsx")){
workbook = new XSSFWorkbook(fis);
}else if(fileName.toLowerCase().endsWith("xls")){
workbook = new HSSFWorkbook(fis);
}
//الحصول على عدد الأوراق في ملف xlsx
int numberOfSheets = workbook.getNumberOfSheets();
//التكرار عبر كل ورقة
for(int i=0; i < numberOfSheets; i++){
//الحصول على الورقة الثانية من مصنف العمل
Sheet sheet = workbook.getSheetAt(i);
//كل ورقة لديها صفوف ، تكرار عبرها
Iterator rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
String name = "";
String shortCode = "";
//الحصول على كائن الصف
Row row = rowIterator.next();
//كل صف لديه أعمدة ، الكرة عبرها
Iterator cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
//الحصول على كائن الخلية
Cell cell = cellIterator.next();
//التحقق من نوع الخلية والمعالجة حسب الحاجة
switch(cell.getCellType()){
case Cell.CELL_TYPE_STRING:
if(shortCode.equalsIgnoreCase("")){
shortCode = cell.getStringCellValue().trim();
}else if(name.equalsIgnoreCase("")){
//العمود الثاني
name = cell.getStringCellValue().trim();
}else{
//بيانات عشوائية ، اتركها
System.out.println("Random data::"+cell.getStringCellValue());
}
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.println("Random data::"+cell.getNumericCellValue());
}
} //end of cell iterator
Country c = new Country(name, shortCode);
countriesList.add(c);
} //end of rows iterator
} //end of sheets for loop
//إغلاق تيار الإدخال من الملف
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return countriesList;
}
public static void main(String args[]){
List list = readExcelData("Sample.xlsx");
System.out.println("Country List\n"+list);
}
}
|
البرنامج سهل جدًا للفهم ويحتوي على الخطوات التالية:
- قم بإنشاء مثيل لـ
Workbook
استنادًا إلى نوع الملف. استخدمXSSFWorkbook
لتنسيق xlsx وHSSFWorkbook
لتنسيق xls. لاحظ أنه يمكننا أن ننشئ فئة محيطة باستخدام نمط المصنع للحصول على مثيل مصنف بناءً على اسم الملف. - استخدم workbook getNumberOfSheets() للحصول على عدد الأوراق ، ثم استخدم حلقة for لتحليل كل ورقة. احصل على مثيل للـ
Sheet
باستخدام طريقة getSheetAt(int i). - احصل على مكرر للصفوف ومكرر للخلايا للحصول على كائن الخلية. تستخدم Apache POI نمط المكرر هنا.
- استخدم تبديل-حالة لقراءة نوع الخلية ومعالجته وفقًا لذلك.
الآن عند تشغيل برنامج مثال Apache POI أعلاه ، يتم إنتاج الإخراج التالي على وحدة التحكم.
Random data::1.0
Random data::2.0
Random data::3.0
Random data::4.0
Country List
[India::IND, Afghanistan::AFG, United States of America::USA, Anguilla::AIA,
Denmark ::DNK, Dominican Republic ::DOM, Algeria ::DZA, Ecuador ::ECU]
مثال Apache POI – كتابة ملف Excel
كتابة ملف Excel في Apache POI مشابهة للقراءة، باستثناء أننا هنا نقوم أولاً بإنشاء الدفتر. ثم نضع قيم الأوراق والصفوف والخلايا ونستخدم FileOutputStream لكتابتها في الملف. دعنا نكتب مثالًا بسيطًا لـ Apache POI حيث سنستخدم قائمة الدول من الأعلى لحفظها في ملف آخر في ورقة واحدة. WriteListToExcelFile.java
package com.journaldev.excel.read;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
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 WriteListToExcelFile {
public static void writeCountryListToFile(String fileName, List countryList) throws Exception{
Workbook workbook = null;
if(fileName.endsWith("xlsx")){
workbook = new XSSFWorkbook();
}else if(fileName.endsWith("xls")){
workbook = new HSSFWorkbook();
}else{
throw new Exception("invalid file name, should be xls or xlsx");
}
Sheet sheet = workbook.createSheet("Countries");
Iterator iterator = countryList.iterator();
int rowIndex = 0;
while(iterator.hasNext()){
Country country = iterator.next();
Row row = sheet.createRow(rowIndex++);
Cell cell0 = row.createCell(0);
cell0.setCellValue(country.getName());
Cell cell1 = row.createCell(1);
cell1.setCellValue(country.getShortCode());
}
//لنقم الآن بكتابة البيانات إلى ملف Excel
FileOutputStream fos = new FileOutputStream(fileName);
workbook.write(fos);
fos.close();
System.out.println(fileName + " written successfully");
}
public static void main(String args[]) throws Exception{
List list = ReadExcelFileToList.readExcelData("Sample.xlsx");
WriteListToExcelFile.writeCountryListToFile("Countries.xls", list);
}
}
عند تنفيذ برنامج مثال Apache POI أعلاه، يبدو الملف Excel الذي تم إنشاؤه على النحو الوارد في الصورة أدناه.
مثال Apache POI – قراءة صيغة Excel
في بعض الأحيان نحتاج إلى التعامل مع ملفات Excel المعقدة التي تحتوي على صيغ، دعنا نرى مثالًا بسيطًا لـ Apache POI لقراءة صيغة الخلية مع قيمتها.
ReadExcelFormula.java
package com.journaldev.excel.read;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
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 ReadExcelFormula {
public static void readExcelFormula(String fileName) throws IOException{
FileInputStream fis = new FileInputStream(fileName);
//على افتراض أن الملف هو xlsx
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
Iterator rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
Row row = rowIterator.next();
Iterator cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
Cell cell = cellIterator.next();
switch(cell.getCellType()){
case Cell.CELL_TYPE_NUMERIC:
System.out.println(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
System.out.println("Cell Formula="+cell.getCellFormula());
System.out.println("Cell Formula Result Type="+cell.getCachedFormulaResultType());
if(cell.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC){
System.out.println("Formula Value="+cell.getNumericCellValue());
}
}
}
}
}
public static void main(String args[]) throws IOException {
readExcelFormula("FormulaMultiply.xlsx");
}
}
|
عند تنفيذ برنامج مثال Apache POI أعلاه، نحصل على الناتج التالي.
1.0
2.0
3.0
4.0
Cell Formula=A1*A2*A3*A4
Cell Formula Result Type=0
Formula Value=24.0
مثال على Apache POI – كتابة صيغة في Excel
أحيانًا، نحتاج إلى إجراء بعض العمليات الحسابية ثم كتابة قيم الخلايا. يمكننا استخدام صيغ الإكسل للقيام بهذه العملية والتي ستجعلها أكثر دقة لأن القيم ستتغير إذا تم تغيير قيم الخلايا المستخدمة في الحسابات. دعونا نرى مثالًا بسيطًا لكتابة ملف إكسل بالصيغ باستخدام واجهة برمجة تطبيقات apache poi. WriteExcelWithFormula.java
package com.journaldev.excel.read;
import java.io.FileOutputStream;
import java.io.IOException;
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 WriteExcelWithFormula {
public static void writeExcelWithFormula(String fileName) throws IOException{
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Numbers");
Row row = sheet.createRow(0);
row.createCell(0).setCellValue(10);
row.createCell(1).setCellValue(20);
row.createCell(2).setCellValue(30);
//ضبط خلية الصيغة
row.createCell(3).setCellFormula("A1*B1*C1");
//لنكتب إلى الملف
FileOutputStream fos = new FileOutputStream(fileName);
workbook.write(fos);
fos.close();
System.out.println(fileName + " written successfully");
}
public static void main(String[] args) throws IOException {
writeExcelWithFormula("Formulas.xlsx");
}
}
يبدو الملف الإكسل الناتج عن برنامج مثال واجهة برمجة تطبيقات Apache POI أعلاه كالصورة أدناه. هذا كل شيء في دليل Apache POI للتعامل مع ملفات الإكسل، انظر في طرق وفئات Apache POI لمعرفة المزيد من ميزاته. المراجع: دليل مطوري Apache POI
Source:
https://www.digitalocean.com/community/tutorials/apache-poi-tutorial