ใช้สูตรแผ่นงานแผนภูมิในงานนำเสนอด้วย C++

ภาพรวม

แผนภูมิ PowerPoint ปกติเก็บข้อมูลต้นฉบับไว้ในแผ่นงานฝังตัว ใน Aspose.Slides for C++ คุณสามารถเข้าถึงแผ่นงานนั้นผ่าน workbook ของข้อมูลแผนภูมิ, เขียนค่าอินพุต, กำหนดสูตรให้กับเซลล์, คำนวณสูตรที่สนับสนุน, และใช้เซลล์ที่คำนวณแล้วเป็นข้อมูลแผนภูมิได้

บทความนี้อธิบายกระบวนการทำสูตรอย่างครบถ้วน: สร้างแผนภูมิ, เติมข้อมูลในแผ่นงาน, กำหนดสูตรแบบ A1 หรือ R1C1, คำนวณสูตรใหม่, อ่านค่าที่คำนวณได้, เชื่อมเซลล์เหล่านั้นกับซีรีส์ของแผนภูมิ, และบันทึกงานนำเสนอ นอกจากนี้ยังอธิบายไวยากรณ์สูตรที่สนับสนุน, ชุดฟังก์ชันในตัว, ค่าที่แคชไว้, สูตรที่ไม่สนับสนุน, และข้อผิดพลาดที่เฉพาะของสเปรดชีต

แผ่นงานชาร์ตและสูตร

แผ่นงานชาร์ตประกอบด้วยประเภท, ชื่อซีรีส์, และค่าที่ใช้โดยแผนภูมิ ใน PowerPoint คุณสามารถตรวจสอบแผ่นงานได้โดยเปิดตัวแก้ไขข้อมูลแผนภูมิ:

PowerPoint chart with its embedded worksheet open, showing category and series data

ใน Aspose.Slides แผ่นงานถูกเปิดเผยผ่านอินเทอร์เฟซIChartDataWorkbook ใช้IChartDataCell::set_Formula สำหรับสูตรแบบ A1 และIChartDataCell::set_R1C1Formula สำหรับสูตรแบบ R1C1 หลังจากเปลี่ยนเซลล์อินพุตหรือสูตร ให้เรียกIChartDataWorkbook::CalculateFormulas เพื่อคำนวณสูตรที่สนับสนุนและอัปเดตค่าของเซลล์ที่สอดคล้องกัน

เซลล์ที่คำนวณแล้วยังคงเปิดเผยผลลัพธ์ผ่านIChartDataCell::get_Value สิ่งนี้สำคัญเมื่อคุณต้องการตรวจสอบผลลัพธ์สูตรในโค้ดหรือใช้เซลล์เป็นจุดข้อมูลของแผนภูมิ

สร้างแผนภูมิและคำนวณสูตรในแผ่นงาน

ตัวอย่างต่อไปนี้แสดงกระบวนการทำงานตั้งแต่ต้นจนจบ มันสร้างแผนภูมิคอลัมน์แบบคลัสเตอร์, ลบข้อมูลตัวอย่าง, เขียนค่ารายได้และค่าใช้จ่ายไตรมาส, คำนวณกำไรด้วยสูตร, อ่านผลลัพธ์, ใช้เซลล์ที่คำนวณแล้วเป็นค่าของแผนภูมิ, และบันทึกงานนำเสนอ

#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartCategoryCollection.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataCell.h>
#include <DOM/Chart/IChartDataPointCollection.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/Chart/IChartSeries.h>
#include <DOM/Chart/IChartSeriesCollection.h>
#include <DOM/Chart/IDataLabelCollection.h>
#include <DOM/Chart/IDataLabelFormat.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/object_ext.h>
#include <system/string.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace Aspose::Slides::Export;
using namespace System;

auto presentation = MakeObject<Presentation>();

auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::ClusteredColumn, 50.0f, 50.0f, 600.0f, 350.0f);
auto chartData = chart->get_ChartData();
auto workbook = chartData->get_ChartDataWorkbook();
const int32_t worksheetIndex = 0;

chartData->get_Series()->Clear();
chartData->get_Categories()->Clear();
workbook->Clear(worksheetIndex);

auto category1 = workbook->GetCell(worksheetIndex, u"A2", ObjectExt::Box<String>(u"Q1"));
auto category2 = workbook->GetCell(worksheetIndex, u"A3", ObjectExt::Box<String>(u"Q2"));
auto category3 = workbook->GetCell(worksheetIndex, u"A4", ObjectExt::Box<String>(u"Q3"));

workbook->GetCell(worksheetIndex, u"B1", ObjectExt::Box<String>(u"Revenue"));
workbook->GetCell(worksheetIndex, u"C1", ObjectExt::Box<String>(u"Expenses"));
workbook->GetCell(worksheetIndex, u"D1", ObjectExt::Box<String>(u"Profit"));

workbook->GetCell(worksheetIndex, u"B2")->set_Value(ObjectExt::Box<double>(120.0));
workbook->GetCell(worksheetIndex, u"C2")->set_Value(ObjectExt::Box<double>(80.0));
workbook->GetCell(worksheetIndex, u"B3")->set_Value(ObjectExt::Box<double>(150.0));
workbook->GetCell(worksheetIndex, u"C3")->set_Value(ObjectExt::Box<double>(95.0));
workbook->GetCell(worksheetIndex, u"B4")->set_Value(ObjectExt::Box<double>(135.0));
workbook->GetCell(worksheetIndex, u"C4")->set_Value(ObjectExt::Box<double>(110.0));

auto profit1 = workbook->GetCell(worksheetIndex, u"D2");
auto profit2 = workbook->GetCell(worksheetIndex, u"D3");
auto profit3 = workbook->GetCell(worksheetIndex, u"D4");

profit1->set_Formula(u"B2-C2");
profit2->set_Formula(u"B3-C3");
profit3->set_Formula(u"B4-C4");

workbook->CalculateFormulas();

auto q1Profit = profit1->get_Value(); // 40
auto q2Profit = profit2->get_Value(); // 55
auto q3Profit = profit3->get_Value(); // 25

chartData->get_Categories()->Add(category1);
chartData->get_Categories()->Add(category2);
chartData->get_Categories()->Add(category3);

auto profitSeries = chartData->get_Series()->Add(workbook->GetCell(worksheetIndex, u"D1"), chart->get_Type());
profitSeries->get_DataPoints()->AddDataPointForBarSeries(profit1);
profitSeries->get_DataPoints()->AddDataPointForBarSeries(profit2);
profitSeries->get_DataPoints()->AddDataPointForBarSeries(profit3);
profitSeries->get_Labels()->get_DefaultDataLabelFormat()->set_ShowValue(true);

presentation->Save(u"chart-formulas.pptx", SaveFormat::Pptx);

จุดข้อมูลของแผนภูมิเกี่ยวกับ D2:D4 ดังนั้นแผนภูมิจะแสดงค่ากำไรที่คำนวณแล้ว ในขั้นตอนนี้ไม่มีการเรียกฟังก์ชันรีเฟรชแผนภูมิแยกออก: คำนวณ workbook ก่อน, แล้วใช้หรือบันทึกข้อมูลแผนภูมิที่อ้างอิงถึงเซลล์ที่คำนวณแล้ว

ใช้สูตรแบบ A1

การระบุแบบ A1 ใช้อักษรเป็นคอลัมน์และตัวเลขเป็นแถว กำหนดนิพจน์แบบ A1 ผ่านIChartDataCell::set_Formula

#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataCell.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;

auto presentation = MakeObject<Presentation>();

auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::ClusteredColumn, 50.0f, 50.0f, 500.0f, 300.0f);
auto workbook = chart->get_ChartData()->get_ChartDataWorkbook();

workbook->GetCell(0, u"C3")->set_Value(ObjectExt::Box<int32_t>(10));
workbook->GetCell(0, u"F2")->set_Value(ObjectExt::Box<int32_t>(2));
workbook->GetCell(0, u"G2")->set_Value(ObjectExt::Box<int32_t>(3));
workbook->GetCell(0, u"H2")->set_Value(ObjectExt::Box<int32_t>(4));

auto cell = workbook->GetCell(0, u"A2");
cell->set_Formula(u"C3+SUM(F2:H2)");

workbook->CalculateFormulas();

auto value = cell->get_Value(); // 19

รูปแบบการอ้างอ้างแบบ A1 ที่พบบ่อยคือ:

การอ้างอ้าง สัมพัทธ์ แน่นอน ผสม
เซลล์ A2 $A$2 A$2, $A2
แถว 2:2 $2:$2
คอลัมน์ A:A $A:$A
ช่วง A2:C4 $A$2:$C$4 A$2:$C4, $A2:C$4

การอ้างอ้างสัมพัทธ์อาจเปลี่ยนเมื่อสูตรถูกย้ายหรือคัดลอกโดยแอปพลิเคชันสเปรดชีต การอ้างอ้างแน่นอนจะคงค่าทั้งสองพิกัดคงที่ ส่วนการอ้างอ้างผสมจะคงแค่แถวหรือคอลัมน์อย่างใดอย่างหนึ่ง

ใช้สูตรแบบ R1C1

การระบุแบบ R1C1 จะใช้ตัวเลขสำหรับทั้งแถวและคอลัมน์ การอ้างอ้างสัมพัทธ์ใช้การชี้ตำแหน่งในวงเล็บสี่เหลี่ยม กำหนดไวยากรณ์นี้ผ่านIChartDataCell::set_R1C1Formula

#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataCell.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;

auto presentation = MakeObject<Presentation>();

auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::ClusteredColumn, 50.0f, 50.0f, 500.0f, 300.0f);
auto workbook = chart->get_ChartData()->get_ChartDataWorkbook();

workbook->GetCell(0, u"B2")->set_Value(ObjectExt::Box<int32_t>(12));
workbook->GetCell(0, u"C2")->set_Value(ObjectExt::Box<int32_t>(5));

auto cell = workbook->GetCell(0, u"D2");
cell->set_R1C1Formula(u"RC[-2]-RC[-1]");

workbook->CalculateFormulas();

auto value = cell->get_Value(); // 7

รูปแบบการอ้างอ้างแบบ R1C1 ที่พบบ่อยคือ:

การอ้างอ้าง สัมพัทธ์ แน่นอน ผสม
เซลล์ R[2]C[3] R2C3 R2C[3], R[2]C3
แถว R[2] R2
คอลัมน์ C[3] C3
ช่วง R[2]C[3]:R[5]C[7] R2C3:R5C7 R2C3:R[5]C[7], R[2]C3:R5C[7]

เช่น ในเซลล์ D2 คำว่า RC[-2] หมายถึงเซลล์ในแถวเดียวกันที่อยู่สองคอลัมน์ทางซ้าย (B2)

ค่าคงที่และตัวดำเนินการของสูตร

เครื่องประเมินสูตรในตัวรองรับค่าตรรกะ, ตัวเลขลิตเตรัล, สตริง, ค่าข้อผิดพลาดของสเปรดชีต, ตัวดำเนินการคณิตศาสตร์, และตัวดำเนินการเปรียบเทียบ

ค่าคงที่และลิตเตรัล

ประเภท ตัวอย่าง หมายเหตุ
ตรรกะ TRUE, FALSE สามารถใช้โดยตรงในนิพจน์ตรรกะ เช่น A2=TRUE
ตัวเลข 1, 0.5, .3, 1E-2 รองรับการเขียนแบบทศนิยมและวิทยาศาสตร์
สตริง "abc", "2/3/2020 12:00" ลิตเตรัลข้อความต้องอยู่ในเครื่องหมายอัญประกาศคู่ภายในสูตร
ผลลัพธ์ข้อผิดพลาด #DIV/0!, #N/A, #REF! สูตรที่ถูกต้องอาจให้ค่าข้อผิดพลาดของสเปรดชีตแทนผลลัพธ์ปกติ

ตัวอย่างนี้ใช้ค่าคงที่หลายประเภท:

#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;

auto presentation = MakeObject<Presentation>();

auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::ClusteredColumn, 50.0f, 50.0f, 500.0f, 300.0f);
auto workbook = chart->get_ChartData()->get_ChartDataWorkbook();

workbook->GetCell(0, u"A2")->set_Value(ObjectExt::Box<bool>(false));
workbook->GetCell(0, u"B2")->set_Formula(u"A2=TRUE");
workbook->GetCell(0, u"C2")->set_Formula(u"1+0.5");
workbook->GetCell(0, u"D2")->set_Formula(u".3*1E-2");
workbook->GetCell(0, u"E2")->set_Formula(u"\"abc\"");
workbook->GetCell(0, u"F2")->set_Formula(u"2/0");

workbook->CalculateFormulas();

auto logicalValue = workbook->GetCell(0, u"B2")->get_Value(); // เท็จ
auto numericValue = workbook->GetCell(0, u"C2")->get_Value(); // 1.5
auto scientificValue = workbook->GetCell(0, u"D2")->get_Value(); // 0.003
auto stringValue = workbook->GetCell(0, u"E2")->get_Value(); // abc
auto errorValue = workbook->GetCell(0, u"F2")->get_Value(); // #DIV/0!

ตัวดำเนินการคณิตศาสตร์

ตัวดำเนินการ ความหมาย ตัวอย่าง
+ การบวกหรือเครื่องหมายบวกเอกเทศ 2+3
- การลบหรือเครื่องหมายลบเอกเทศ 2-3, -3
* การคูณ 2*3
/ การหาร 2/3
% เปอร์เซ็นต์ 30%
^ ยกกำลัง 2^3

ใช้วงเล็บเพื่อทำให้ลำดับการประเมินชัดเจน เช่น (A2+B2)*C2

ตัวดำเนินการเปรียบเทียบ

นิพจน์เปรียบเทียบให้ค่าแบบตรรกะ

ตัวดำเนินการ ความหมาย ตัวอย่าง
= เท่ากับ A2=3
<> ไม่เท่ากับ A2<>3
> มากกว่า A2>3
>= มากกว่าหรือเท่ากับ A2>=3
< น้อยกว่า A2<3
<= น้อยกว่าหรือเท่ากับ A2<=3

ฟังก์ชันที่กำหนดล่วงหน้าและสนับสนุน

Aspose.Slides มีเครื่องประเมินสูตรในตัวสำหรับแผ่นงานแผนภูมิ แต่ไม่ใช่เครื่องยนต์คำนวณ Excel เต็มรูปแบบ ชุดฟังก์ชันที่ระบุไว้จำกัดอยู่ในตารางด้านล่าง อย่าสันนิษฐานว่าฟังก์ชัน Excel ใด ๆ สามารถคำนวณใหม่ได้โดยIChartDataWorkbook::CalculateFormulas

ฟังก์ชัน วัตถุประสงค์หรือรูปแบบที่สนับสนุน ตัวอย่าง
ABS ค่าตัวเลขเชิงสัมบูรณ์ ABS(A2)
AVERAGE ค่าเฉลี่ยคณิตศาสตร์ AVERAGE(B2:B5)
CEILING ปัดเศษขึ้นเป็นหลายเท่าที่กำหนด CEILING(A2,5)
CHOOSE เลือกค่าโดยดัชนี CHOOSE(A2,"Low","High")
CONCAT เชื่อมข้อความ CONCAT(A2,B2)
CONCATENATE เชื่อมข้อความ CONCATENATE(A2," ",B2)
DATE สร้างค่าที่เป็นวันที่โดยใช้ระบบวันที่ 1900 DATE(2026,8,19)
DAYS คืนจำนวนวันระหว่างสองวัน DAYS(B2,A2)
FIND ค้นหาข้อความหนึ่งภายในอีกข้อความหนึ่ง FIND("-",A2)
FINDB ค้นหาข้อความโดยอิงไบต์ FINDB("a",A2)
IF ผลลัพธ์ตามเงื่อนไข IF(A2>0,A2,0)
INDEX รูปแบบการอ้างอ้าง INDEX(A2:C4,2,3)
LOOKUP รูปแบบเวกเตอร์ LOOKUP(A2,B2:B5,C2:C5)
MATCH รูปแบบเวกเตอร์ MATCH(A2,B2:B5,0)
MAX ค่ามากสุด MAX(B2:B5)
SUM ผลรวมค่า SUM(B2:B5)
VLOOKUP การค้นหาแนวตั้ง VLOOKUP(A2,B2:D10,3,FALSE)

ข้อจำกัดที่แสดงในตารางสำคัญ: INDEX ระบุในรูปแบบการอ้างอ้าง, ส่วน LOOKUP และ MATCH ระบุในรูปแบบเวกเตอร์ DATE ใช้ระบบวันที่ 1900 ฟังก์ชันที่ไม่ได้ระบุในที่นี้ควรถือว่าไม่สนับสนุนโดยเครื่องประเมินสูตรของ Aspose.Slides เว้นแต่จะมีเอกสารแยกต่างหาก

คำนวณสูตรด้วยวัฒนธรรมที่ต้องการ

บางฟังก์ชันของ workbook แปลข้อความตามกฎเฉพาะวัฒนธรรม สิ่งนี้สำคัญอย่างยิ่งสำหรับฟังก์ชันที่ออกแบบมาสำหรับภาษาที่ใช้ชุดอักษรสองไบต์ (DBCS) เพื่อคำนวณสูตรเหล่านี้อย่างถูกต้อง ให้สร้างLoadOptions, กำหนดค่าISpreadsheetOptions::set_PreferredCulture ผ่านLoadOptions::set_SpreadsheetOptions, แล้วโหลดงานนำเสนอ

ตัวอย่างต่อไปนี้เลือกวัฒนธรรมญี่ปุ่น, เปิดงานนำเสนอด้วยตัวเลือกโหลดที่กำหนด, และเรียกIChartDataWorkbook::CalculateFormulas สำหรับทุก workbook ของแผนภูมิ

#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/IChart.h>
#include <DOM/IShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/LoadOptions.h>
#include <DOM/Presentation.h>
#include <DOM/SpreadsheetOptions.h>
#include <system/globalization/culture_info.h>
#include <system/object_ext.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
using namespace System::Globalization;

auto japaneseCulture = CultureInfo::GetCultureInfo(u"ja-JP");

auto spreadsheetOptions = MakeObject<SpreadsheetOptions>();
spreadsheetOptions->set_PreferredCulture(japaneseCulture);

auto loadOptions = MakeObject<LoadOptions>();
loadOptions->set_SpreadsheetOptions(spreadsheetOptions);

auto presentation = MakeObject<Presentation>(u"presentation.pptx", loadOptions);

for (int32_t slideIndex = 0; slideIndex < presentation->get_Slides()->get_Count(); slideIndex++)
{
    auto slide = presentation->get_Slide(slideIndex);

    for (int32_t shapeIndex = 0; shapeIndex < slide->get_Shapes()->get_Count(); shapeIndex++)
    {
        auto shape = slide->get_Shape(shapeIndex);
        if (ObjectExt::Is<IChart>(shape))
        {
            auto chart = ExplicitCast<IChart>(shape);
            chart->get_ChartData()->get_ChartDataWorkbook()->CalculateFormulas();
        }
    }
}

วัฒนธรรมที่ต้องการเป็นส่วนหนึ่งของการกำหนดค่าการโหลดงานนำเสนอ ดังนั้นต้องระบุก่อนสร้างอินสแตนซ์Presentation ใช้วัฒนธรรมที่สูตรของ workbook คาดหวัง; ตัวอย่างเช่นใช้ ja-JP สำหรับสูตรที่ควรปฏิบัติตามกฎการคำนวณ DBCS ของญี่ปุ่น

การคำนวณซ้ำและค่าที่แคชไว้

ไฟล์สเปรดชีตมักจะเก็บสูตรพร้อมค่าที่คำนวณล่าสุด Aspose.Slides จึงสามารถอ่านค่าที่แคชจากIChartDataCell::get_Value เมื่อโหลดงานนำเสนอและข้อมูลแผนภูมิที่เกี่ยวข้องไม่ได้ถูกเปลี่ยน

หลังจากเปลี่ยนเซลล์อินพุตหรือสูตร อย่าอิงค่าที่แคชเก่า เรียกIChartDataWorkbook::CalculateFormulas ก่อนอ่านค่าที่คำนวณหรือบันทึกข้อมูลแผนภูมิที่ขึ้นอยู่กับค่าเหล่านั้น

สำหรับสูตรที่อยู่นอกชุดที่สนับสนุน Aspose.Slides อาจไม่สามารถแยกสูตรหรือหาความขึ้นต่อกันได้ หาก workbook ถูกแก้ไข ค่าที่แคชไว้ก่อนหน้านั้นจะไม่เชื่อถือได้ ในกรณีดังกล่าว การอ่านค่าของเซลล์ที่มีข้อมูลที่ไม่สนับสนุนอาจทำให้เกิดCellUnsupportedDataException

หากแผนภูมิของคุณต้องพึ่งพาฟังก์ชัน Excel ที่ Aspose.Slides ไม่ประมวลผล ให้คำนวณสูตรเหล่านั้นด้วยเครื่องยนต์สเปรดชีตที่สนับสนุนและเขียนค่าที่ได้กลับไปยัง workbook ของแผนภูมิ อย่าแทนสูตรที่ไม่สนับสนุนด้วยค่าที่คาดเดา

จัดการข้อผิดพลาดของสูตร

มีสองประเภทของปัญหาที่ต้องแยกแยะ

สูตรอาจถูกต้องแต่ให้ผลลัพธ์เป็นค่าข้อผิดพลาดของสเปรดชีต เช่น #DIV/0!, #N/A, #NAME?, #NULL!, #NUM!, #REF!, หรือ #VALUE! ในกรณีนี้ token ข้อผิดพลาดเป็นผลลัพธ์ของเซลล์และสามารถคืนค่าผ่านIChartDataCell::get_Value

สูตรอาจล้มเหลวที่ขั้นตอนการแยก, การอ้างอิง, ความขึ้นต่อกัน, หรือระดับข้อมูลที่สนับสนุน Aspose.Slides มีข้อยกเว้นเฉพาะสเปรดชีตสำหรับสถานการณ์เหล่านี้: CellInvalidFormulaException, CellInvalidReferenceException, CellCircularReferenceException, และ CellUnsupportedDataException

เมื่อสูตรมาจากแม่แบบหรือผู้ใช้ ให้จัดการข้อยกเว้นเหล่านี้รอบการคำนวณซ้ำและการเข้าถึงค่า:

#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataCell.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Spreadsheet/CellCircularReferenceException.h>
#include <Spreadsheet/CellInvalidFormulaException.h>
#include <Spreadsheet/CellInvalidReferenceException.h>
#include <Spreadsheet/CellUnsupportedDataException.h>

using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace Aspose::Slides::Spreadsheet;
using namespace System;

auto presentation = MakeObject<Presentation>();

auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::ClusteredColumn, 50.0f, 50.0f, 500.0f, 300.0f);
auto workbook = chart->get_ChartData()->get_ChartDataWorkbook();
auto cell = workbook->GetCell(0, u"A2");
cell->set_Formula(u"SUM(B2:B5)");

try
{
    workbook->CalculateFormulas();
    auto value = cell->get_Value();
}
catch (CellInvalidFormulaException&)
{
    // จัดการสูตรที่ไม่ถูกต้อง.
}
catch (CellInvalidReferenceException&)
{
    // จัดการการอ้างอิงเซลล์ที่ไม่ถูกต้อง.
}
catch (CellCircularReferenceException&)
{
    // จัดการการอ้างอิงแบบวนลูป.
}
catch (CellUnsupportedDataException&)
{
    // จัดการข้อมูลสเปรดชีตที่ไม่สนับสนุน.
}

ข้อจำกัดเชิงปฏิบัติ

การสนับสนุนสูตรในแผ่นงานแผนภูมิมีเป้าหมายสำหรับชุดย่อยที่กำหนดของการคำนวณสเปรดชีต ไม่ได้เพื่อความเข้ากันได้เต็มรูปแบบกับ Excel คำนึงถึงข้อจำกัดเหล่านี้เมื่อออกแบบการทำงานของรายงาน:

  • ใช้เพียงค่าคงที่, ตัวดำเนินการ, การอ้างอิง, และฟังก์ชันที่ระบุไว้เมื่อคุณต้องการให้ Aspose.Slides คำนวณสูตรใหม่
  • คำนวณซ้ำหลังจากเปลี่ยนเซลล์ที่ผลลัพธ์สูตรพึ่งพา
  • ถือค่าที่แคชจากงานนำเสนอที่โหลดเป็นภาพสแนปชอต ไม่ใช่ทดแทนการคำนวณใหม่หลังการแก้ไข
  • ทดสอบสูตรจากแม่แบบที่มีอยู่ก่อนพึ่งพาค่าที่คำนวณได้, โดยเฉพาะอย่างยิ่งเมื่อใช้ฟังก์ชันที่อยู่นอกรายการที่ระบุ
  • สำหรับสูตรที่ต้องการเครื่องยนต์คำนวณสเปรดชีตเต็มรูปแบบ ให้คำนวณภายนอกแล้วอัปเดตค่าใน workbook ของแผนภูมิ

คำถามที่พบบ่อย

ความแตกต่างระหว่าง set_Formula กับ set_R1C1Formula คืออะไร?

IChartDataCell::set_Formula เก็บนิพจน์แบบ A1 เช่น B2-C2 ส่วนIChartDataCell::set_R1C1Formula เก็บนิพจน์แบบ R1C1 เช่น RC[-2]-RC[-1] ใช้รูปแบบที่สอดคล้องกับวิธีการสร้างหรือคัดลอกสูตรของคุณ

ต้องอ่านเซลล์เองหรือค่าในเซลล์หลังการคำนวณหรือไม่?

IChartDataWorkbook::GetCell คืนค่า IChartDataCell ให้ได้ผลลัพธ์ที่คำนวณแล้ว ให้เรียกIChartDataCell::get_Value หลังการคำนวณ

ควรเรียก CalculateFormulas เมื่อใด?

เรียกIChartDataWorkbook::CalculateFormulas หลังจากเปลี่ยนค่าอินพุตหรือสูตรและก่อนที่คุณจะพึ่งพาผลลัพธ์ที่คำนวณแล้ว ซึ่งจะอัปเดตค่าของสูตรที่เครื่องประเมินในตัวสนับสนุน

Aspose.Slides รองรับทุกฟังก์ชันของ Excel หรือไม่?

ไม่. เครื่องประเมินในตัวรองรับชุดฟังก์ชันที่ระบุไว้เท่านั้น ฟังก์ชันที่อยู่นอกชุดนั้นไม่ควรสันนิษฐานว่าจะคำนวณได้อย่างถูกต้อง หากต้องการความเข้ากันได้เต็มรูปแบบของสูตร Excel ให้ทำการคำนวณด้วยเครื่องยนต์สเปรดชีตที่เหมาะสมและเขียนค่าที่ได้ลงใน workbook ของแผนภูมิ

จะเกิดอะไรขึ้นหากงานนำเสนอที่โหลดมีสูตรที่ไม่สนับสนุน?

ถ้าข้อมูลแผนภูมิไม่ได้เปลี่ยน แบ่ง workbook อาจยังคงมีค่าที่แคชจากการคำนวณก่อนหน้า หลังจากที่ข้อมูลที่เกี่ยวข้องถูกแก้ไข ค่าที่แคชนั้นอาจไม่ถูกต้อง การเข้าถึงเซลล์ที่สูตรไม่สามารถจัดการได้อาจทำให้เกิดCellUnsupportedDataException

ค่าข้อผิดพลาดของสูตรคือข้อยกเว้นของ C++ หรือไม่?

ไม่. ผลลัพธ์เช่น #DIV/0! เป็นค่าของสเปรดชีตที่มาจากการคำนวณที่ถูกต้อง ข้อยกเว้นเช่น CellInvalidFormulaException หรือ CellCircularReferenceException บ่งบอกว่สูตรไม่สามารถประมวลผลตามปกติได้

แผนภูมิจะอัพเดตอัตโนมัติเมื่อเซลล์สูตรเปลี่ยนหรือไม่?

ซีรีส์ของแผนภูมิสามารถอ้างอิงเซลล์ใน workbook ได้ คำนวณ workbook ก่อนแล้วบันทึกหรือเรนเดอร์งานนำเสนอ หากจุดข้อมูลของแผนภูมิเกี่ยวกับเซลล์ที่คำนวณแล้ว แผนภูมิจะใช้ค่าที่อัพเดตเหล่านั้น; ไม่จำเป็นต้องมีเมธอดรีเฟรชแผนภูมิเพิ่มเติม

แผนภูมิสามารถใช้ workbook ของ Excel ภายนอกได้หรือไม่?

ได้, ข้อมูลแผนภูมิสามารถกำหนดให้ใช้ workbook ภายนอกผ่าน API ของข้อมูลแผนภูมิ อย่างไรก็ตาม กระบวนการคำนวณสูตรที่อธิบายในบทความนี้เกี่ยวกับ workbook ของแผนภูมิและชุดสูตรที่ Aspose.Slides ประเมินค่า อย่าสันนิษฐานว่าIChartDataWorkbook::CalculateFormulas ให้การคำนวณเต็มรูปแบบของสูตรใด ๆ ในไฟล์ XLSX ภายนอก

ฉันสามารถใช้สูตรที่อ้างอิงถึงแผ่นงานหรือ workbook อื่นได้หรือไม่?

การอ้างอิงสไตล์ Excel อาจมีอยู่ใน workbook ของแผนภูมิ แต่การประเมินสูตรจำกัดโดยเครื่องแยกสูตรและชุดฟังก์ชันที่สนับสนุน หากการอ้างอิงข้ามแผ่นงานหรือไฟล์ภายนอกเป็นสิ่งจำเป็น ให้ตรวจสอบสูตรนั้นกับเวอร์ชัน Aspose.Slides ที่คุณใช้ สำหรับกระบวนการที่ต้องการความเข้ากันได้ของการอ้างอิง Excel อย่างกว้างขวาง ให้คำนวณ workbook ภายนอกแล้วเขียนค่าที่แก้ไขกลับไปยังข้อมูลแผนภูมิ

สูตรควรเริ่มด้วยเครื่องหมาย = หรือไม่?

ตัวอย่าง API ของ Aspose.Slides กำหนดนิพจน์เช่น B2-C2 หรือ SUM(B2:B5) โดยไม่มีเครื่องหมาย = นำรูปแบบนั้นไปใช้ทำให้สูตรที่สร้างสอดคล้องกับตัวอย่าง API ที่ระบุไว้