Способы вычисления формул
Вступление
Aspose.Cells имеет встроенный механизм расчета формул. Он может не только пересчитывать формулы, импортированные из шаблонов конструктора, но также поддерживает вычисление результатов формул, добавленных во время выполнения.
Добавление формул и расчет результатов
Aspose.Cells поддерживает большинство формул и функций, входящих в состав Microsoft Excel. их можно использовать по телефону API или с помощью электронных таблиц дизайнера. Aspose.Cells поддерживает огромный набор математических, строковых, логических, дат/времени, статистических, поисковых и справочных формул.
Используйте метод Cell.Formula, чтобы добавить формулу в ячейку. При применении формулы к ячейке всегда начинайте строку со знака равенства (=), как при создании формулы в Microsoft Excel. Используйте запятую (,) для разделения параметров функции.
Чтобы вычислить результаты формул, вызовите метод Workbook.CalculateFormula(), который обрабатывает все формулы, встроенные в файл Excel. См. следующий пример кода, который добавляет формулу и вычисляет ее результаты. Пожалуйста, проверьтевыходной файл excel генерируется с помощью этого кода.
Образец кода
//For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-C | |
//Output directory path | |
StringPtr outPath = new String("..\\Data\\Output\\"); | |
//Path of output excel file | |
StringPtr outputAddingFormulasAndCalculatingResults = outPath->StringAppend(new String("outputAddingFormulasAndCalculatingResults.xlsx")); | |
//Create workbook | |
intrusive_ptr<IWorkbook> wb = Factory::CreateIWorkbook(); | |
//Access first worksheet in the workbook | |
intrusive_ptr<IWorksheet> ws = wb->GetIWorksheets()->GetObjectByIndex(0); | |
//Adding integer values to cells A1, A2 and A3 | |
ws->GetICells()->GetObjectByIndex(new String("A1"))->PutValue(10); | |
ws->GetICells()->GetObjectByIndex(new String("A2"))->PutValue(20); | |
ws->GetICells()->GetObjectByIndex(new String("A3"))->PutValue(70); | |
//Adding a SUM formula to "A4" cell | |
ws->GetICells()->GetObjectByIndex(new String("A4"))->SetFormula(new String("=SUM(A1:A3)")); | |
//Calculating the results of formulas | |
wb->CalculateFormula(); | |
//Get the calculated value of the cell | |
intrusive_ptr<String> strVal = ws->GetICells()->GetObjectByIndex(new String("A4"))->GetStringValue(); | |
//Print the calculated value on console | |
StringPtr str1 = new String("Calculated Result: "); | |
Console::WriteLine(str1->StringAppend(strVal)); | |
//Saving the workbook | |
wb->Save(outputAddingFormulasAndCalculatingResults); |
Прямой расчет формулы
Иногда вам нужно вычислить результаты формулы напрямую, не добавляя их на лист. Значения ячеек, используемых в формуле, уже существуют на рабочем листе, и все, что вам нужно, это найти результат этих значений на основе какой-либо формулы Excel Microsoft без добавления формулы на рабочий лист.
Вы можете использовать метод Worksheet.CalculateFormula(String Formula) для вычисления результатов таких формул, не добавляя их на лист.
Код ниже производит следующий вывод.
Value of A1: 20
Value of A2: 30
Result of Sum(A1:A2): 50
Образец кода
//For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-C | |
//Create workbook | |
intrusive_ptr<IWorkbook> wb = Factory::CreateIWorkbook(); | |
//Access first worksheet in the workbook | |
intrusive_ptr<IWorksheet> ws = wb->GetIWorksheets()->GetObjectByIndex(0); | |
//Put 20 in cell A1 | |
intrusive_ptr<ICell> cellA1 = ws->GetICells()->GetObjectByIndex(new String("A1")); | |
cellA1->PutValue(20); | |
//Put 30 in cell A2 | |
intrusive_ptr<ICell> cellA2 = ws->GetICells()->GetObjectByIndex(new String("A2")); | |
cellA2->PutValue(30); | |
//Calculate the Sum of A1 and A2 | |
intrusive_ptr<Aspose::Cells::System::Object> results = ws->CalculateFormula(new String("=Sum(A1:A2)")); | |
//Print the output | |
StringPtr str1 = new String("Value of A1: "); | |
Console::WriteLine(str1->StringAppend(cellA1->GetStringValue())); | |
StringPtr str2 = new String("Value of A2: "); | |
Console::WriteLine(str2->StringAppend(cellA2->GetStringValue())); | |
StringPtr str3 = new String("Result of Sum(A1:A2): "); | |
Console::WriteLine(str3->StringAppend(results->ToString())); |
Расчет формул только один раз
Когда Workbook.CalculateFormula() вызывается для вычисления значений формул в шаблоне книги, Aspose.Cells создает цепочку вычислений. Это увеличивает производительность, когда формулы вычисляются во второй или третий раз.
Однако, если шаблон содержит много формул, при первом вычислении формулы может потребоваться много процессорного времени и памяти.
Aspose.Cells позволяет отключить создание цепочки вычислений, что полезно, когда вы хотите вычислить формулы только один раз.
Пожалуйста, вызовите Workbook.GetISettings().SetCreateCalcChain() с ложным параметром. Вы можете использоватьпредоставил эксель файл для проверки этого кода.
Образец кода
//For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-C | |
//Source directory path | |
StringPtr dirPath = new String("..\\Data\\Formulas\\"); | |
//Path of input excel file | |
StringPtr sampleCalculatingFormulasOnceOnly = dirPath->StringAppend(new String("sampleCalculatingFormulasOnceOnly.xlsx")); | |
//Create workbook | |
intrusive_ptr<IWorkbook> wb = Factory::CreateIWorkbook(sampleCalculatingFormulasOnceOnly); | |
//Set the CreateCalcChain as false | |
wb->GetISettings()->SetCreateCalcChain(false); | |
//Get the time in milliseconds before formula calculation | |
int before_miliseconds = Aspose::Cells::System::DateTime::GetNow()->GetMillisecond(); | |
//Calculate the workbook formulas | |
wb->CalculateFormula(); | |
//Get the time in milliseconds after formula calculation | |
int after_miliseconds = Aspose::Cells::System::DateTime::GetNow()->GetMillisecond(); | |
//Print the difference in milliseconds | |
StringPtr str1 = new String("Workbook Formula Calculation Elapsed Time in Milliseconds: "); | |
Console::WriteLine(str1->StringAppend(Int32Helper::ToString(after_miliseconds - before_miliseconds))); |