تقليل وقت حساب أسلوب 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