จัดการเวิร์กบุ๊คแผนภูมิในงานนำเสนอด้วย C++
ภาพรวม
บทความนี้อธิบายวิธีการทำงานกับเวิร์กบุ๊คแผนภูมิใน Aspose.Slides โดยแสดงวิธีการอ่านและเขียนข้อมูลแผนภูมิผ่านสตรีมของเวิร์กบุ๊ค ใช้เซลล์ของเวิร์กบุ๊คเป็นป้ายชื่อข้อมูลแผนภูมิ เข้าถึงคอลเลกชันแผ่นงาน และระบุประเภทแหล่งข้อมูลสำหรับค่าของแผนภูมิ
ยังครอบคลุมการทำงานกับเวิร์กบุ๊คภายนอกเป็นแหล่งข้อมูลของแผนภูมิ ตัวอย่างจะแสดงวิธีการสร้างและกำหนดเวิร์กบุ๊คภายนอก ดึงเส้นทางของเวิร์กบุ๊คภายนอกที่เชื่อมโยงกับแผนภูมิ และแก้ไขข้อมูลแผนภูมิเมื่อเวิร์กบุ๊คพร้อมใช้งาน
สำหรับเซลล์เวิร์กบุ๊คที่แสดงข้อมูลที่หายไป ดูที่ ควบคุมการแสดงเซลล์ว่าง เพื่อเปรียบเทียบความแตกต่างระหว่างเซลล์ว่างกับศูนย์ และเปรียบเทียบโหมดการแสดงผลของแผนภูมิเส้น
รวมข้อมูลจากแถวและคอลัมน์ที่ซ่อน
ใช้IChart::set_PlotVisibleCellsOnlyเพื่อควบคุมว่าแผนภูมิจะพล็อตข้อมูลจากแถวและคอลัมน์ของแผ่นงานที่ซ่อนหรือไม่ ตั้งค่าเป็นtrueเพื่อพล็อตเฉพาะเซลล์ที่มองเห็นได้ หรือ falseเพื่อรวมทั้งเซลล์ที่มองเห็นและซ่อน การตั้งค่านี้ควบคุมการพล็อตของแผนภูมิเท่านั้น ไม่ได้ซ่อนหรือแสดงแถวหรือคอลัมน์ของแผ่นงาน
ดาวน์โหลดhidden-source-data.pptxและวางไว้ในไดเรกทอรีทำงาน สไลด์แรกมีแผนภูมิคอลัมน์เป็นรูปทรงแรก แผ่นงานฝังรวม Sheet1 มีช่วงข้อมูลต้นทาง A1:C4 แถวที่ 3 และคอลัมน์ C ถูกซ่อน แต่เซลล์ยังคงมีค่า
| แถวเวิร์กชีต | A: เดือน | B: ขายปลีก | C: ขายส่ง (คอลัมน์ที่ซ่อน) |
|---|---|---|---|
| 2 | มกราคม | 10 | 30 |
| 3 (แถวที่ซ่อน) | กุมภาพันธ์ | 40 | 60 |
| 4 | มีนาคม | 20 | 50 |
เข้าถึงเซลล์ต้นทางผ่านIChartData::get_ChartDataWorkbookและอ่านIChartDataCell::get_IsHiddenเพื่อพิจารณาสถานะการซ่อนของเซลล์ คุณสมบัตินี้อ่านได้อย่างเดียว ในไฟล์นี้ B2 มองเห็นได้ B3 อยู่ในแถวที่ซ่อน และ C2 อยู่ในคอลัมน์ที่ซ่อน; ตัวอย่างจะพิมพ์ False, True, และ True ตามลำดับ
สำหรับตัวอย่างนี้ ให้รีเฟรชข้อมูลแผนภูมิหลังจากเปลี่ยนการตั้งค่าการพล็อต: รักษาเวิร์กบุ๊คฝังรวมด้วยReadWorkbookStreamและโหลดใหม่ด้วยWriteWorkbookStream เมื่อรวมทุกเซลล์ ให้ใช้SetRangeเพื่อกู้คืนช่วงทั้งหมดรวมถึงหมวดเดือนกุมภาพันธ์ที่ซ่อน การเปลี่ยนแฟล็กอย่างเดียวไม่เพียงพอที่จะรีเฟรชข้อมูลแผนภูมิที่แคชไว้และป้ายชื่อหมวดของตัวอย่างนี้
#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 <Export/SaveFormat.h>
#include <initializer_list>
#include <system/console.h>
#include <system/io/memory_stream.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
auto presentation = MakeObject<Presentation>(u"hidden-source-data.pptx");
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->get_Count() > 0 ? AsCast<IChart>(slide->get_Shape(0)) : nullptr;
if (chart != nullptr)
{
auto workbook = chart->get_ChartData()->get_ChartDataWorkbook();
Console::WriteLine(u"B2 hidden: {0}", workbook->GetCell(0, u"B2")->get_IsHidden());
Console::WriteLine(u"B3 hidden: {0}", workbook->GetCell(0, u"B3")->get_IsHidden());
Console::WriteLine(u"C2 hidden: {0}", workbook->GetCell(0, u"C2")->get_IsHidden());
auto workbookStream = chart->get_ChartData()->ReadWorkbookStream();
for (auto visibleOnly : {true, false})
{
chart->set_PlotVisibleCellsOnly(visibleOnly);
// รีเฟรชข้อมูลแผนภูมิจากเวิร์กบุ๊คที่ฝังรวม.
workbookStream->set_Position(0);
chart->get_ChartData()->WriteWorkbookStream(workbookStream);
if (!visibleOnly)
{
// กู้คืนช่วงต้นทางเต็มรวมถึงหมวดที่ซ่อน.
chart->get_ChartData()->SetRange(u"Sheet1!$A$1:$C$4");
}
auto outputPath = visibleOnly ? u"hidden_cells_True.pptx" : u"hidden_cells_False.pptx";
presentation->Save(outputPath, Export::SaveFormat::Pptx);
}
}
else
{
Console::WriteLine(u"The first shape is not a chart.");
}
ตัวอย่างบันทึก hidden_cells_True.pptx โดยมีค่า Retail ที่มองเห็นเท่านั้น (10 และ 20) และ hidden_cells_False.pptx โดยมีค่าทั้งหกค่า รูปภาพด้านล่างแสดงสองโหมดการพล็อต แถวที่ 3 และคอลัมน์ C ยังคงซ่อนอยู่ในทั้งสองเวิร์กบุ๊คฝังรวม
เฉพาะเซลล์ที่มองเห็น (true) |
ทุกเซลล์ (false) |
|---|---|
![]() |
![]() |
เซลล์ที่ซ่อนซึ่งมีค่าแตกต่างจากเซลล์ว่างIChart::get_DisplayBlanksAsควบคุมวิธีการแสดงค่าที่หายไป; มันไม่ได้รวมหรือยกเว้นข้อมูลต้นทางที่ซ่อน ดูที่ควบคุมการแสดงเซลล์ว่างสำหรับตัวอย่าง
อ่านและเขียนข้อมูลแผนภูมิจากเวิร์กบุ๊ค
Aspose.Slides for C++ มีเมธอดReadWorkbookStreamและWriteWorkbookStreamที่ให้คุณอ่านและเขียนเวิร์กบุ๊คข้อมูลแผนภูมิ (ซึ่งอาจแก้ไขด้วย Aspose.Cells) หมายเหตุ ข้อมูลแผนภูมิต้องจัดระเบียบในลักษณะเดียวกันหรือมีโครงสร้างคล้ายกับแหล่งต้นทาง
ตัวอย่างนี้เปิด chart.pptx ซึ่งต้องมีแผนภูมิเป็นรูปทรงแรกบนสไลด์แรก มันอ่านเวิร์กบุ๊คฝังรวมเข้าสตรีม ลบชุดข้อมูลและหมวดหมู่ที่มีอยู่ และเขียนเวิร์กบุ๊คเดิมกลับไป การเปลี่ยนแปลงยังคงอยู่ในหน่วยความจำ ตัวอย่างไม่ได้บันทึกงานนำเสนอ
#include <DOM/Chart/IChartCategoryCollection.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartSeriesCollection.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/console.h>
#include <system/io/memory_stream.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
auto presentation = MakeObject<Presentation>(u"chart.pptx");
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->get_Count() > 0 ? AsCast<IChart>(slide->get_Shape(0)) : nullptr;
if (chart != nullptr)
{
auto chartData = chart->get_ChartData();
auto workbookStream = chartData->ReadWorkbookStream();
chartData->get_Series()->Clear();
chartData->get_Categories()->Clear();
workbookStream->set_Position(0);
chartData->WriteWorkbookStream(workbookStream);
}
else
{
Console::WriteLine(u"The first shape is not a chart.");
}
ตรวจสอบเค้าโครงแผนภูมิหลังการแก้ไขเวิร์กบุ๊ค
เมื่อคุณแทนที่เวิร์กบุ๊คฝังรวมด้วยเวิร์กบุ๊คที่แก้ไขแล้ว แผนภูมิจะยังคงรักษาชุดข้อมูลและคอลเลกชันหมวดเดิม ความไม่ตรงกันนี้อาจทำให้IChart::ValidateChartLayoutล้มเหลวด้วยข้อผิดพลาดดัชนีอยู่นอกช่วง ก่อนเขียนเวิร์กบุ๊คที่อัปเดตกลับไปยังแผนภูมิ ให้ลบชุดข้อมูลและหมวดเดิมออก ตัวอย่างนี้ต้องการ chart.pptx ที่มีแผนภูมิเป็นรูปทรงแรกบนสไลด์แรก คอมเมนต์ระบุจุดที่การแก้ไขเวิร์กบุ๊คจะเกิดขึ้น; ตัวอย่างที่ทำงานได้จะเขียนเวิร์กบุ๊คเดิมกลับและตรวจสอบเค้าโครงในหน่วยความจำ
#include <DOM/Chart/IChartCategoryCollection.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartSeriesCollection.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/console.h>
#include <system/io/memory_stream.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
auto presentation = MakeObject<Presentation>(u"chart.pptx");
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->get_Count() > 0 ? AsCast<IChart>(slide->get_Shape(0)) : nullptr;
if (chart != nullptr)
{
auto chartData = chart->get_ChartData();
auto workbookStream = chartData->ReadWorkbookStream();
// แก้ไขสตรีมเวิร์กบุ๊คที่นี่, ตัวอย่างเช่น, ด้วย Aspose.Cells.
chartData->get_Series()->Clear();
chartData->get_Categories()->Clear();
workbookStream->set_Position(0);
chartData->WriteWorkbookStream(workbookStream);
chart->ValidateChartLayout();
}
else
{
Console::WriteLine(u"The first shape is not a chart.");
}
การลบคอลเลกชันจะทำให้การอ้างอิงข้อมูลล้าสมัยถูกตัดออกก่อนที่เวิร์กบุ๊คจะถูกเขียนกลับ ให้สร้างชุดข้อมูลและการแมปหมวดใหม่ตามที่ต้องการสำหรับเวิร์กบุ๊คที่อัปเดตก่อนใช้แผนภูมิ
ตั้งค่าเซลล์เวิร์กบุ๊คเป็นป้ายข้อมูลแผนภูมิ
คุณสามารถใช้ข้อความจากเซลล์เวิร์กบุ๊คเป็นป้ายข้อมูลแผนภูมิ ขั้นตอนต่อไปนี้แสดงวิธีการเชื่อมป้ายในแผนภูมิบับเบิลกับเซลล์ในเวิร์กบุ๊คข้อมูลของมัน
- สร้างอินสแตนซ์ของคลาสPresentation
- เข้าถึงสไลด์แรกด้วยดัชนีที่เริ่มจากศูนย์
- เพิ่มแผนภูมิบับเบิลด้วยข้อมูลเริ่มต้น
- เข้าถึงชุดข้อมูลของแผนภูมิ
- ตั้งค่าเซลล์เวิร์กบุ๊คเป็นป้ายข้อมูล
- บันทึกงานนำเสนอ
ตัวอย่างนี้เปิด chart2.pptx ซึ่งต้องมีอย่างน้อยหนึ่งสไลด์ และเพิ่มแผนภูมิบับเบิลด้วยข้อมูลเริ่มต้น ใช้เซลล์ A10:A12 ในแผ่นงาน 0 สำหรับป้ายสามอันแรกของชุดข้อมูลแรก เปิดใช้งานป้ายจากเซลล์ และบันทึกผลลัพธ์เป็น resultchart.pptx
#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataCell.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/Chart/IChartSeries.h>
#include <DOM/Chart/IChartSeriesCollection.h>
#include <DOM/Chart/IDataLabel.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>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
auto presentation = MakeObject<Presentation>(u"chart2.pptx");
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->AddChart(ChartType::Bubble, 50, 50, 600, 400, true);
auto series = chart->get_ChartData()->get_Series()->idx_get(0);
auto workbook = chart->get_ChartData()->get_ChartDataWorkbook();
series->get_Labels()->get_DefaultDataLabelFormat()->set_ShowLabelValueFromCell(true);
auto firstLabelCell = workbook->GetCell(0, u"A10", ObjectExt::Box<String>(u"Label 0 cell value"));
auto secondLabelCell = workbook->GetCell(0, u"A11", ObjectExt::Box<String>(u"Label 1 cell value"));
auto thirdLabelCell = workbook->GetCell(0, u"A12", ObjectExt::Box<String>(u"Label 2 cell value"));
series->get_Labels()->idx_get(0)->set_ValueFromCell(firstLabelCell);
series->get_Labels()->idx_get(1)->set_ValueFromCell(secondLabelCell);
series->get_Labels()->idx_get(2)->set_ValueFromCell(thirdLabelCell);
presentation->Save(u"resultchart.pptx", Export::SaveFormat::Pptx);
จัดการแผ่นงาน
เมธอดIChartDataWorkbook::get_Worksheetsให้เข้าถึงแผ่นงานในเวิร์กบุ๊คแผนภูมิ ตัวอย่างนี้สร้างแผนภูมิพายด้วยข้อมูลเริ่มต้นและพิมพ์ชื่อแผ่นงานแต่ละชื่อลงคอนโซล
#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/Chart/IChartDataWorksheet.h>
#include <DOM/Chart/IChartDataWorksheetCollection.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/console.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::Pie, 50, 50, 400, 500);
auto workbook = chart->get_ChartData()->get_ChartDataWorkbook();
for (auto i = 0; i < workbook->get_Worksheets()->get_Count(); i++)
{
Console::WriteLine(workbook->get_Worksheets()->idx_get(i)->get_Name());
}
ระบุประเภทแหล่งข้อมูล
ตัวอย่างนี้สร้างแผนภูมิคอลัมน์ 3 มิติด้วยข้อมูลเริ่มต้นและตั้งชื่อชุดข้อมูลสองชุดโดยใช้แหล่งข้อมูลที่ต่างกัน ชื่อแรกใช้สตริงลิเทอรัล; ชื่อที่สองใช้เซลล์ C1 ในแผ่นงาน 0 ค่าตัวเลขDataSourceTypeเลือกแหล่งข้อมูลสำหรับแต่ละชื่อ ผลลัพธ์บันทึกเป็น pres.pptx
#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/DataSourceType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataCell.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/Chart/IChartSeries.h>
#include <DOM/Chart/IChartSeriesCollection.h>
#include <DOM/Chart/IStringChartValue.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>
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::Column3D, 50, 50, 600, 400, true);
auto literalName = chart->get_ChartData()->get_Series()->idx_get(0)->get_Name();
literalName->set_DataSourceType(DataSourceType::StringLiterals);
literalName->set_Data(ObjectExt::Box<String>(u"LiteralString"));
auto cellName = chart->get_ChartData()->get_Series()->idx_get(1)->get_Name();
auto nameCell = chart->get_ChartData()->get_ChartDataWorkbook()->GetCell(0, u"C1", ObjectExt::Box<String>(u"NewCell"));
cellName->set_DataSourceType(DataSourceType::Worksheet);
cellName->set_Data(nameCell);
presentation->Save(u"pres.pptx", Export::SaveFormat::Pptx);
ตรวจจับรูปแบบเวิร์กบุ๊คที่ฝังที่ไม่รองรับ
Aspose.Slides ไม่รองรับรูปแบบเวิร์กบุ๊ค Excel แบบไบนารี (.xlsb) ที่อาจฝังในบางแผนภูมิ คุณสามารถใช้เมธอดIChartData::get_EmbeddedWorkbookTypeร่วมกับWorkbookTypeเพื่อตรวจจับรูปแบบที่ไม่รองรับและข้ามแผนภูมนั้น ตัวอย่างนี้ตรวจสอบรูปร่างบนสไลด์แรกของ sample.pptx ข้ามรูปร่างที่ไม่ใช่แผนภูมิ และพิมพ์ข้อความวินิจฉัยสำหรับแผนภูมิแต่ละอันที่มีเวิร์กบุ๊ค .xlsb ฝัง
#include <DOM/Chart/ChartDataSourceType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/WorkbookType.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <system/console.h>
#include <system/enumerator_adapter.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);
for (auto shape : IterateOver(slide->get_Shapes()))
{
auto chart = AsCast<IChart>(shape);
if (chart == nullptr)
{
continue;
}
auto chartData = chart->get_ChartData();
auto isInternalWorkbook = chartData->get_DataSourceType() == ChartDataSourceType::InternalWorkbook;
auto isBinaryMacro = chartData->get_EmbeddedWorkbookType() == WorkbookType::WorkbookBinaryMacro;
if (isInternalWorkbook && isBinaryMacro)
{
Console::WriteLine(u"Skipping a chart with an unsupported .xlsb workbook.");
continue;
}
// อ่านหรือแก้ไขข้อมูลเวิร์กบุ๊คแผนภูมิที่รองรับที่นี่.
}
เวิร์กบุ๊คภายนอก
Aspose.Slides รองรับการใช้เวิร์กบุ๊คภายนอกเป็นแหล่งข้อมูลของแผนภูมิ
สร้างเวิร์กบุ๊คภายนอก
ใช้ReadWorkbookStreamและSetExternalWorkbookเพื่อส่งออกเวิร์กบุ๊คแผนภูมิที่ฝังรวมเป็นไฟล์และเชื่อมแผนภูมิไปยังเวิร์กบุ๊คภายนอกนั้น
ตัวอย่างนี้สร้างแผนภูมิพายด้วยข้อมูลเริ่มต้น เขียนเวิร์กบุ๊คเป็น externalWorkbook1.xlsx และปิดสตรีมออกก่อนกำหนดไฟล์เป็นแหล่งข้อมูลของแผนภูมิ งานนำเสนอที่เชื่อมโยงจะถูกบันทึกเป็น externalWorkbook.pptx
#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/io/file.h>
#include <system/io/file_stream.h>
#include <system/io/memory_stream.h>
#include <system/io/path.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::Pie, 50, 50, 400, 600);
auto workbookPath = IO::Path::GetFullPath(u"externalWorkbook1.xlsx");
auto workbookStream = chart->get_ChartData()->ReadWorkbookStream();
auto fileStream = IO::File::Create(workbookPath);
workbookStream->CopyTo(fileStream);
fileStream->Close();
chart->get_ChartData()->SetExternalWorkbook(workbookPath);
presentation->Save(u"externalWorkbook.pptx", Export::SaveFormat::Pptx);
กำหนดเวิร์กบุ๊คภายนอก
โดยใช้เมธอดSetExternalWorkbookคุณสามารถกำหนดเวิร์กบุ๊คภายนอกให้กับแผนภูมิเป็นแหล่งข้อมูลได้เมธอดนี้ยังใช้เพื่ออัปเดตเส้นทางของเวิร์กบุ๊คภายนอก (หากไฟล์นั้นถูกย้าย)
แม้ว่าจะไม่สามารถแก้ไขข้อมูลในเวิร์กบุ๊คที่เก็บไว้ในตำแหน่งระยะไกลหรือทรัพยากรได้ คุณยังคงใช้เวิร์กบุ๊คเหล่านั้นเป็นแหล่งข้อมูลภายนอกได้ หากระบุเส้นทางแบบสัมพัทธ์สำหรับเวิร์กบุ๊คภายนอก มันจะถูกแปลงเป็นเส้นทางเต็มโดยอัตโนมัติ
ตัวอย่างนี้ต้องการ externalWorkbook.xlsx อยู่ในไดเรกทอรีทำงาน แผ่นงานชื่อ Sheet1 จะต้องมีชื่อชุดข้อมูลใน B1 ชื่อหมวดใน A2:A4 และค่าเชิงตัวเลขใน B2:B4 ตัวอย่างสร้างแผนภูมิพาย เชื่อมเวิร์กบุ๊ค และใช้SetRangeเพื่อแมป A1:B4 เป็นหนึ่งชุดข้อมูลและสามหมวด ผลลัพธ์บันทึกเป็น Presentation_with_externalWorkbook.pptx
#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/io/path.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::Pie, 50, 50, 400, 600, true);
auto chartData = chart->get_ChartData();
auto workbookPath = IO::Path::GetFullPath(u"externalWorkbook.xlsx");
chartData->SetExternalWorkbook(workbookPath);
chartData->SetRange(u"Sheet1!$A$1:$B$4");
presentation->Save(u"Presentation_with_externalWorkbook.pptx", Export::SaveFormat::Pptx);
พารามิเตอร์updateChartDataของSetExternalWorkbookควบคุมว่าจะโหลดเวิร์กบุ๊คหรือไม่
- เมื่อ
updateChartDataเป็นfalseจะอัปเดตเฉพาะเส้นทางของเวิร์กบุ๊ค เท่านั้น ข้อมูลแผนภูมิจะไม่ถูกโหลดหรืออัปเดตจากเวิร์กบุ๊คเป้าหมาย ดังนั้นเวิร์กบุ๊คอาจไม่มีอยู่ - เมื่อ
updateChartDataเป็นtrueข้อมูลแผนภูมิจะถูกอัปเดตจากเวิร์กบุ๊คเป้าหมาย
ตัวอย่างต่อไปกำหนด URL ตัวแทนพร้อมupdateChartDataเป็นfalse มันยังคงรักษาข้อมูลเริ่มต้นของแผนภูมิพายและบันทึกงานนำเสนอโดยไม่โหลดเวิร์กบุ๊คที่ไม่มีอยู่
#include <DOM/Chart/ChartType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.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::Pie, 50, 50, 400, 600, true);
chart->get_ChartData()->SetExternalWorkbook(u"https://example.com/unavailable-workbook.xlsx", false);
presentation->Save(u"SetExternalWorkbookWithUpdateChartData.pptx", Export::SaveFormat::Pptx);
รับเส้นทางเวิร์กบุ๊คแหล่งข้อมูลภายนอกของแผนภูมิ
เพื่อระบุเวิร์กบุ๊คที่เชื่อมโยงกับแผนภูมิ ให้ตรวจสอบว่ามีการใช้แหล่งข้อมูลภายนอกหรือไม่ หากมี ให้ดึงเส้นทางเวิร์กบุ๊คตามขั้นตอนต่อไปนี้
- สร้างอินสแตนซ์ของคลาสPresentation
- เข้าถึงสไลด์แรกด้วยดัชนีที่เริ่มจากศูนย์
- ตรวจสอบว่ารูปร่างแรกเป็นแผนภูมิหรือไม่
- อ่านประเภทแหล่งข้อมูลของแผนภูมิ
- หากเป็นเวิร์กบุ๊คภายนอก ให้อ่านเส้นทางของมัน
ตัวอย่างนี้เปิด externalWorkbook.pptx ที่สร้างในตัวอย่างก่อนหน้าและตรวจสอบรูปร่างแรกบนสไลด์แรก หากมันเป็นแผนภูมิที่เชื่อมกับเวิร์กบุ๊คภายนอก ตัวอย่างจะพิมพ์get_ExternalWorkbookPathไปยังคอนโซล จากนั้นบันทึกสำเนาของงานนำเสนอเป็น Result.pptx
#include <DOM/Chart/ChartDataSourceType.h>
#include <DOM/Chart/IChartData.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
auto presentation = MakeObject<Presentation>(u"externalWorkbook.pptx");
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->get_Count() > 0 ? AsCast<IChart>(slide->get_Shape(0)) : nullptr;
if (chart != nullptr)
{
auto chartData = chart->get_ChartData();
if (chartData->get_DataSourceType() == ChartDataSourceType::ExternalWorkbook)
{
Console::WriteLine(chartData->get_ExternalWorkbookPath());
}
else
{
Console::WriteLine(u"The chart does not use an external workbook.");
}
}
else
{
Console::WriteLine(u"The first shape is not a chart.");
}
presentation->Save(u"Result.pptx", Export::SaveFormat::Pptx);
แก้ไขข้อมูลแผนภูมิ
คุณสามารถแก้ไขข้อมูลในเวิร์กบุ๊คภายนอกได้เช่นเดียวกับการเปลี่ยนแปลงเนื้อหาของเวิร์กบุ๊คภายใน หากเวิร์กบุ๊คภายนอกไม่สามารถโหลดได้ จะเกิดข้อยกเว้น
ตัวอย่างนี้ต้องการ presentation.pptx ที่มีแผนภูมิเป็นรูปร่างแรกบนสไลด์แรกและเวิร์กบุ๊คภายนอกที่เข้าถึงได้ มันตั้งค่าค่าที่รองรับจากเซลล์ของจุดข้อมูลแรกในชุดข้อมูลแรกเป็น 100 และบันทึกงานนำเสนอเป็น presentation_out.pptx การแก้ไขค่าจากเซลล์อาจอัปเดตไฟล์ XLSX ภายนอกที่เชื่อมโยง จึงควรใช้สำเนาเมื่อต้องการเก็บเวิร์กบุ๊คต้นฉบับไว้
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataCell.h>
#include <DOM/Chart/IChartDataPoint.h>
#include <DOM/Chart/IChartDataPointCollection.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/Chart/IChartSeries.h>
#include <DOM/Chart/IChartSeriesCollection.h>
#include <DOM/Chart/IDoubleChartValue.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <system/console.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
auto presentation = MakeObject<Presentation>(u"presentation.pptx");
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->get_Count() > 0 ? AsCast<IChart>(slide->get_Shape(0)) : nullptr;
if (chart != nullptr)
{
auto series = chart->get_ChartData()->get_Series();
if (series->get_Count() > 0 && series->idx_get(0)->get_DataPoints()->get_Count() > 0)
{
auto valueCell = series->idx_get(0)->get_DataPoints()->idx_get(0)->get_Value()->get_AsCell();
if (valueCell != nullptr)
{
valueCell->set_Value(ObjectExt::Box<int32_t>(100));
presentation->Save(u"presentation_out.pptx", Export::SaveFormat::Pptx);
}
else
{
Console::WriteLine(u"The first data point is not linked to a workbook cell.");
}
}
else
{
Console::WriteLine(u"The chart has no data points to edit.");
}
}
else
{
Console::WriteLine(u"The first shape is not a chart.");
}
กู้คืนเวิร์กบุ๊คจากแคชของแผนภูมิ
หากแผนภูมิใช้เวิร์กบุ๊คภายนอกที่หายไปหรือไม่มีอยู่ Aspose.Slides สามารถสร้างเวิร์กบุ๊คแผนภูมิจากข้อมูลที่แคชในงานนำเสนอได้ สร้างLoadOptions กำหนดค่าโดยใช้set_SpreadsheetOptions และเรียกISpreadsheetOptions::set_RecoverWorkbookFromChartCacheเป็นtrueก่อนเปิดงานนำเสนอ
ตัวอย่าง C++ ด้านล่างเปิด presentation.pptx โดยรูปร่างแรกบนสไลด์แรกต้องเป็นแผนภูมิที่อ้างอิงเวิร์กบุ๊คภายนอกที่ไม่มีอยู่ และเข้าถึงข้อมูลที่กู้คืนผ่านIChart::get_ChartDataและIChartData::get_ChartDataWorkbook:
#include <DOM/Chart/IChartData.h>
#include <DOM/Chart/IChartDataWorkbook.h>
#include <DOM/IChart.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/LoadOptions.h>
#include <DOM/Presentation.h>
#include <DOM/SpreadsheetOptions.h>
#include <system/console.h>
#include <system/object_ext.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Charts;
using namespace System;
auto spreadsheetOptions = MakeObject<SpreadsheetOptions>();
spreadsheetOptions->set_RecoverWorkbookFromChartCache(true);
auto loadOptions = MakeObject<LoadOptions>();
loadOptions->set_SpreadsheetOptions(spreadsheetOptions);
auto presentation = MakeObject<Presentation>(u"presentation.pptx", loadOptions);
auto slide = presentation->get_Slide(0);
auto chart = slide->get_Shapes()->get_Count() > 0 ? AsCast<IChart>(slide->get_Shape(0)) : nullptr;
if (chart != nullptr)
{
auto recoveredWorkbook = chart->get_ChartData()->get_ChartDataWorkbook();
// อ่านหรือแก้ไขข้อมูลเวิร์กบุ๊คที่กู้คืนที่นี่.
}
else
{
Console::WriteLine(u"The first shape is not a chart.");
}
หากเวิร์กบุ๊คภายนอกไม่มีอยู่และการกู้คืนถูกปิดใช้งาน Aspose.Slides จะโยนSystem::InvalidOperationException ให้เปิดการกู้คืนเท่านั้นเมื่อการใช้ข้อมูลแคชของแผนภูมิเป็นวิธีสำรองที่ยอมรับได้ เพราะแคชอาจไม่มีการเปลี่ยนแปลงที่ทำในเวิร์กบุ๊ครุ่นหลังจากที่งานนำเสนออัพเดตล่าสุด
คำถามที่พบบ่อย
ฉันสามารถตรวจสอบได้หรือไม่ว่าแผนภูมิใดเชื่อมโยงกับเวิร์กบุ๊คภายนอกหรือเวิร์กบุ๊คที่ฝังรวม?
ได้ แผนภูมิมีประเภทแหล่งข้อมูลและเส้นทางไปยังเวิร์กบุ๊คภายนอก หากแหล่งเป็นเวิร์กบุ๊คภายนอก คุณสามารถอ่านเส้นทางเต็มเพื่อยืนยันว่าใช้ไฟล์ภายนอกหรือไม่
รองรับเส้นทางแบบสัมพัทธ์ไปยังเวิร์กบุ๊คภายนอกหรือไม่ และเก็บอย่างไร?
รองรับ หากคุณระบุเส้นทางแบบสัมพัทธ์ มันจะถูกแปลงเป็นเส้นทางเต็มอัตโนมัติ งานนำเสนอเก็บเส้นทางเต็มในไฟล์ PPTX ดังนั้นการย้ายเวิร์กบุ๊คอาจต้องอัปเดตลิงก์
ฉันสามารถใช้เวิร์กบุ๊คที่อยู่บนทรัพยากร/แชร์เครือข่ายได้หรือไม่?
ได้ เวิร์กบุ๊คเหล่านั้นสามารถใช้เป็นแหล่งข้อมูลภายนอกได้ อย่างไรก็ตาม การแก้ไขเวิร์กบุ๊คราวไกลโดยตรงจาก Aspose.Slides ไม่ได้รับการสนับสนุน — สามารถใช้เป็นแหล่งข้อมูลเท่านั้น
Aspose.Slides จะเขียนทับไฟล์ XLSX ภายนอกเมื่อบันทึกงานนำเสนอหรือไม่?
งานนำเสนอเก็บลิงก์ไปยังไฟล์ภายนอก การแก้ไขข้อมูลแผนภูมิที่อิงจากเซลล์อาจอัปเดตไฟล์ XLSX ภายในเครื่องได้ ใช้สำเนาของเวิร์กบุ๊คหากต้องการให้ไฟล์ต้นฉบับไม่เปลี่ยนแปลง
ควรทำอย่างไรหากไฟล์ภายนอกมีการป้องกันด้วยรหัสผ่าน?
Aspose.Slides ไม่รับรหัสผ่านเมื่อเชื่อมโยง วิธีทั่วไปคือถอดการป้องกันล่วงหน้าหรือเตรียมสำเนาที่ถอดรหัสแล้ว (เช่น ใช้Aspose.Cells) แล้วเชื่อมโยงไปยังสำเนานั้น
หลายแผนภูมิสามารถอ้างอิงเวิร์กบุ๊คภายนอกเดียวกันได้หรือไม่?
ได้ แต่ละแผนภูมิจะเก็บลิงก์ของตนเอง หากทั้งหมดชี้ไปยังไฟล์เดียวกัน การอัปเดตไฟล์นั้นจะสะท้อนในแต่ละแผนภูมิเมื่อโหลดข้อมูลครั้งถัดไป

