باستخدام LightCells API

العمارة المدفوعة بالحدث

يوفر Aspose.Cells LightCells API ، المصمم بشكل أساسي لمعالجة بيانات الخلية واحدًا تلو الآخر دون إنشاء كتلة نموذج بيانات كاملة (باستخدام مجموعة Cell وما إلى ذلك) في الذاكرة. إنه يعمل في وضع يحركه الحدث.

لحفظ المصنفات ، قم بتوفير محتوى الخلية خلية تلو الأخرى عند الحفظ ، ويحفظها المكون في ملف الإخراج مباشرة.

عند قراءة ملفات القوالب ، يوزع المكون كل خلية ويقدم قيمتها واحدة تلو الأخرى.

في كلا الإجراءين ، تتم معالجة كائن Cell واحد ثم يتم التخلص منه ، لا يحتفظ كائن المصنف بالمجموعة. في هذا الوضع ، يتم حفظ الذاكرة عند استيراد وتصدير ملف Microsoft Excel الذي يحتوي على مجموعة بيانات كبيرة والتي من شأنها أن تستخدم قدرًا كبيرًا من الذاكرة.

على الرغم من أن LightCells API يعالج الخلايا بنفس الطريقة لملفات XLSX و XLS (لا يقوم فعليًا بتحميل جميع الخلايا في الذاكرة ولكنه يعالج خلية واحدة ثم يتجاهلها) ، فإنه يوفر الذاكرة بشكل أكثر فعالية لملفات XLSX من ملفات XLS بسبب نماذج البيانات المختلفة وهياكل التنسيقين.

لكن،لملفات XLS لتوفير المزيد من الذاكرة ، يمكن للمطورين تحديد موقع مؤقت لحفظ البيانات المؤقتة التي تم إنشاؤها أثناء عملية الحفظ. عادة،قد يؤدي استخدام LightCells API لحفظ ملف XLSX إلى توفير 50٪ أو أكثر من الذاكرة من استخدام الطريقة الشائعة ،حفظ XLS قد يوفر حوالي 20-40٪ من الذاكرة.

كتابة ملفات إكسل كبيرة

يوفر Aspose.Cells واجهة ، LightCellsDataProvider ، يجب تنفيذها في برنامجك. تمثل الواجهة مزود البيانات لحفظ ملفات جداول البيانات الكبيرة في وضع الوزن الخفيف.

عند حفظ مصنف بواسطة هذا الوضع ، يتم تحديد startSheet (int) عند حفظ كل ورقة عمل في المصنف. بالنسبة إلى ورقة واحدة ، إذا كانت startSheet (int) صحيحة ، فسيتم توفير جميع بيانات وخصائص الصفوف والخلايا في هذه الورقة المراد حفظها بواسطة هذا التنفيذ. في المقام الأول ، يتم استدعاء nextRow () للحصول على فهرس الصف التالي ليتم حفظه. إذا تم إرجاع فهرس صف صالح (يجب أن يكون فهرس الصف بترتيب تصاعدي حتى يتم حفظ الصفوف) ، فسيتم توفير كائن صف يمثل هذا الصف للتنفيذ لتعيين خصائصه بواسطة startRow (الصف).

لصف واحد ، يتم التحقق من nextCell () أولاً. إذا تم إرجاع فهرس عمود صالح (يجب أن يكون فهرس العمود بترتيب تصاعدي لجميع الخلايا في صف واحد ليتم حفظه) ، فسيتم توفير كائن Cell يمثل هذه الخلية لتعيين البيانات والخصائص بواسطة startCell (Cell). بعد تعيين بيانات هذه الخلية ، يتم حفظ هذه الخلية مباشرة في ملف جدول البيانات الذي تم إنشاؤه وسيتم فحص الخلية التالية ومعالجتها.

يوضح المثال التالي كيفية عمل LightCells API.

يقوم البرنامج التالي بإنشاء ملف ضخم به 100000 سجل في ورقة عمل مليئة بالبيانات. لقد أضفنا بعض الارتباطات التشعبية وقيم السلاسل والقيم الرقمية وكذلك الصيغ إلى خلايا معينة في ورقة العمل. علاوة على ذلك ، قمنا بتنسيق مجموعة من الخلايا أيضًا.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
public class LightCellsDataProviderDemo implements LightCellsDataProvider {
private final int sheetCount;
private final int maxRowIndex;
private final int maxColIndex;
private int rowIndex;
private int colIndex;
private final Style style1;
private final Style style2;
public LightCellsDataProviderDemo(Workbook wb, int sheetCount, int rowCount, int colCount) {
// set the variables/objects
this.sheetCount = sheetCount;
this.maxRowIndex = rowCount - 1;
this.maxColIndex = colCount - 1;
// add new style object with specific formattings
style1 = wb.createStyle();
Font font = style1.getFont();
font.setName("MS Sans Serif");
font.setSize(10);
font.setBold(true);
font.setItalic(true);
font.setUnderline(FontUnderlineType.SINGLE);
font.setColor(Color.fromArgb(0xffff0000));
style1.setHorizontalAlignment(TextAlignmentType.CENTER);
// create another style
style2 = wb.createStyle();
style2.setCustom("#,##0.00");
font = style2.getFont();
font.setName("Copperplate Gothic Bold");
font.setSize(8);
style2.setPattern(BackgroundType.SOLID);
style2.setForegroundColor(Color.fromArgb(0xff0000ff));
style2.setBorder(BorderType.TOP_BORDER, CellBorderType.THICK, Color.getBlack());
style2.setVerticalAlignment(TextAlignmentType.CENTER);
}
public boolean isGatherString() {
return false;
}
public int nextCell() {
if (colIndex < maxColIndex) {
colIndex++;
return colIndex;
}
return -1;
}
public int nextRow() {
if (rowIndex < maxRowIndex) {
rowIndex++;
colIndex = -1; // reset column index
if (rowIndex % 1000 == 0) {
System.out.println("Row " + rowIndex);
}
return rowIndex;
}
return -1;
}
public void startCell(Cell cell) {
if (rowIndex % 50 == 0 && (colIndex == 0 || colIndex == 3)) {
// do not change the content of hyperlink.
return;
}
if (colIndex < 10) {
cell.putValue("test_" + rowIndex + "_" + colIndex);
cell.setStyle(style1);
} else {
if (colIndex == 19) {
cell.setFormula("=Rand() + test!L1");
} else {
cell.putValue(rowIndex * colIndex);
}
cell.setStyle(style2);
}
}
public void startRow(Row row) {
row.setHeight(25);
}
public boolean startSheet(int sheetIndex) {
if (sheetIndex < sheetCount) {
// reset row/column index
rowIndex = -1;
colIndex = -1;
return true;
}
return false;
}
}
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
public class Demo {
private static final String OUTPUT_FILE_PATH = Utils.getDataDir(LightCellsDataProviderDemo.class);
public static void main(String[] args) throws Exception {
// Instantiate a new Workbook
Workbook wb = new Workbook();
// set the sheet count
int sheetCount = 1;
// set the number of rows for the big matrix
int rowCount = 100000;
// specify the worksheet
for (int k = 0; k < sheetCount; k++) {
Worksheet sheet = null;
if (k == 0) {
sheet = wb.getWorksheets().get(k);
sheet.setName("test");
} else {
int sheetIndex = wb.getWorksheets().add();
sheet = wb.getWorksheets().get(sheetIndex);
sheet.setName("test" + sheetIndex);
}
Cells cells = sheet.getCells();
// set the columns width
for (int j = 0; j < 15; j++) {
cells.setColumnWidth(j, 15);
}
// traverse the columns for adding hyperlinks and merging
for (int i = 0; i < rowCount; i++) {
// The first 10 columns
for (int j = 0; j < 10; j++) {
if (j % 3 == 0) {
cells.merge(i, j, 1, 2, false, false);
}
if (i % 50 == 0) {
if (j == 0) {
sheet.getHyperlinks().add(i, j, 1, 1, "test!A1");
} else if (j == 3) {
sheet.getHyperlinks().add(i, j, 1, 1, "http://www.google.com");
}
}
}
// The second 10 columns
for (int j = 10; j < 20; j++) {
if (j == 12) {
cells.merge(i, j, 1, 3, false, false);
}
}
}
}
// Create an object with respect to LightCells data provider
LightCellsDataProviderDemo dataProvider = new LightCellsDataProviderDemo(wb, 1, rowCount, 20);
// Specify the XLSX file's Save options
OoxmlSaveOptions opt = new OoxmlSaveOptions();
// Set the data provider for the file
opt.setLightCellsDataProvider(dataProvider);
// Save the big file
wb.save(OUTPUT_FILE_PATH + "/DemoTest.xlsx", opt);
}
}

قراءة ملفات إكسل الكبيرة

توفر Aspose.Cells واجهة ، LightCellsDataHandler ، يجب تنفيذها في برنامجك. تمثل الواجهة مزود البيانات لقراءة ملفات جداول البيانات الكبيرة في وضع خفيف الوزن.

عند قراءة مصنف في هذا الوضع ، يتم تحديد startSheet () عند قراءة كل ورقة عمل في المصنف. بالنسبة للورقة ، إذا أعادت startSheet () القيمة صحيحة ، فسيتم فحص ومعالجة جميع بيانات وخصائص الخلايا في صفوف وأعمدة الورقة. لكل صف ، يتم استدعاء startRow () للتحقق مما إذا كانت بحاجة إلى المعالجة. إذا احتاج الصف إلى المعالجة ، فستتم قراءة خصائص الصف أولاً ويمكن للمطورين الوصول إلى خصائصه باستخدام processRow ().

إذا كانت خلايا الصف بحاجة أيضًا إلى المعالجة ، فعندئذٍ تُرجع processRow () القيمة true ويتم استدعاء startCell () لكل خلية موجودة في الصف للتحقق مما إذا كانت بحاجة إلى المعالجة. إذا حدث ذلك ، فسيتم استدعاء processCell ().

يوضح نموذج التعليمات البرمجية التالي هذه العملية. يقوم البرنامج بقراءة ملف كبير به ملايين من السجلات. يستغرق الأمر بعض الوقت لقراءة كل ورقة في المصنف. يقرأ نموذج التعليمة البرمجية الملف ويسترد العدد الإجمالي للخلايا وعدد السلاسل وعدد الصيغ لكل ورقة عمل.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
public class LightCellsTest1 {
public static void main(String[] args) throws Exception {
String dataDir = Utils.getDataDir(LightCellsTest1.class);
LoadOptions opts = new LoadOptions();
LightCellsDataHandlerVisitCells v = new LightCellsDataHandlerVisitCells();
opts.setLightCellsDataHandler((LightCellsDataHandler) v);
Workbook wb = new Workbook(dataDir + "LargeBook1.xlsx", opts);
int sheetCount = wb.getWorksheets().getCount();
System.out.println("Total sheets: " + sheetCount + ", cells: " + v.cellCount + ", strings: " + v.stringCount
+ ", formulas: " + v.formulaCount);
}
}

فئة تقوم بتنفيذ واجهة LightCellsDataHandler

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
public class LightCellsDataHandlerVisitCells implements LightCellsDataHandler {
public int cellCount;
public int formulaCount;
public int stringCount;
public LightCellsDataHandlerVisitCells() {
this.cellCount = 0;
this.formulaCount = 0;
this.stringCount = 0;
}
public int cellCount() {
return cellCount;
}
public int formulaCount() {
return formulaCount;
}
public int stringCount() {
return stringCount;
}
public boolean startSheet(Worksheet sheet) {
System.out.println("Processing sheet[" + sheet.getName() + "]");
return true;
}
public boolean startRow(int rowIndex) {
return true;
}
public boolean processRow(Row row) {
return true;
}
public boolean startCell(int column) {
return true;
}
public boolean processCell(Cell cell) {
this.cellCount = this.cellCount + 1;
if (cell.isFormula()) {
this.formulaCount = this.formulaCount + 1;
} else if (cell.getType() == CellValueType.IS_STRING) {
this.stringCount = this.stringCount + 1;
}
return false;
}
}