تقليل وقت حساب أسلوب Cell.Calculate

سيناريوهات الاستخدام المحتملة

عادةً، نوصي المستخدمين باستدعاء طريقة Workbook.CalculateFormula() مرة واحدة ثم الحصول على القيم المحسوبة للخلايا الفردية. لكن أحيانًا، لا يرغب المستخدمون في حساب كامل دفتر العمل. إنهم يريدون فقط حساب خلية واحدة. توفر Aspose.Cells الخاصية CalculationOptions.Recursive والتي يمكنك تعيينها إلى false وسيقلل ذلك بشكل كبير من وقت حساب الخلية الفردية. لأنه عندما يتم تعيين الخاصية التكرارية إلى true، يتم إعادة حساب جميع المعتمدين على كل استدعاء. ولكن عندما يتم تعيين الخاصية إلى false، يتم حساب الخلايا المعتمدة مرة واحدة فقط ولا تُعاد حسابها على الاستدعاءات التالية.

تخفيض وقت حساب الخلية لوسيلة (.Calculate())

يوضح الرمز النموذجي التالي استخدام خاصية CalculationOptions.Recursive. يرجى تنفيذ هذا الرمز مع ملف إكسل عينة محدد والتحقق من الناتج في وحدة التحكم. ستجد أن تعيين الخاصية التكرارية على false قلل وقت الحساب بشكل ملحوظ. يرجى أيضًا قراءة التعليقات لفهم أفضل لهذه الخاصية.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
public static void main(String[] args) throws Exception {
// Test calculation time after setting recursive true
TestCalcTimeRecursive(true);
// Test calculation time after setting recursive false
TestCalcTimeRecursive(false);
}
// --------------------------------------------------
static void TestCalcTimeRecursive(boolean rec) throws Exception {
String dataDir = Utils.getDataDir(DecreaseCalculationTime.class);
// Load your sample workbook
Workbook wb = new Workbook(dataDir + "sample.xlsx");
// Access first worksheet
Worksheet ws = wb.getWorksheets().get(0);
// Set the calculation option, set recursive true or false as per parameter
CalculationOptions opts = new CalculationOptions();
opts.setRecursive(rec);
// Start calculating time in nanoseconds
long startTime = System.nanoTime();
// Calculate cell A1 one million times
for (int i = 0; i < 1000000; i++) {
ws.getCells().get("A1").calculate(opts);
}
// Calculate elapsed time in seconds
long second = 1000000000;
long estimatedTime = System.nanoTime() - startTime;
estimatedTime = estimatedTime / second;
// Print the elapsed time in seconds
System.out.println("Recursive " + rec + ": " + estimatedTime + " seconds");
}

مخرجات الوحدة

هذا هو ناتج وحدة التحكم من الرمز النموذجي أعلاه عند تنفيذه مع ملف إكسل عينة محدد على جهازنا. يرجى ملاحظة، قد تختلف الناتج ولكن سيكون الوقت المنقضي بعد تعيين الخاصية التكرارية على false دائمًا أقل من تعيينها على true.

 Recursive true: 51 seconds

Recursive false: 16 seconds