Уменьшить время вычисления метода Cell.Calculate
Возможные сценарии использования
Обычно мы рекомендуем пользователям вызывать метод Workbook.CalculateFormula() один раз, а затем получать вычисленные значения отдельных ячеек. Но иногда пользователи не хотят вычислять весь рабочий лист. Они хотят вычислить только одну ячейку. Aspose.Cells предоставляет свойство CalculationOptions.Recursive, которое можно установить в false, и это уменьшит время вычисления отдельной ячейки значительно. Поскольку при установке свойства рекурсивного в true все зависимые ячейки пересчитываются при каждом вызове. Но при установке свойства рекурсивного в false, зависимые ячейки вычисляются только один раз и не вычисляются снова при последующих вызовах.
Уменьшение времени вычисления метода Cell.Calculate()
Приведенный ниже образец кода иллюстрирует использование свойства CalculationOptions.Recursive. Пожалуйста, выполните этот код с данным образцом файла Excel и проверьте его вывод в консоли. Вы увидите, что установка свойства рекурсии в 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"); | |
} |
Вывод в консоль
Это вывод консоли вышеуказанного образца кода при выполнении с данным образцом файла Excel на нашем устройстве. Обратите внимание, что ваш вывод может отличаться, но затраченное время после установки свойства рекурсии в false всегда будет меньше, чем при установке его в true.
Recursive true: 51 seconds
Recursive false: 16 seconds