โซลูชันการทำงานสำหรับการปรับขนาดแผนภูมิใน PPTX
Background
แผนภูมิ Excel ที่ฝังเป็นวัตถุ OLE ในงานนำเสนอ PowerPoint โดยใช้คอมโพเนนต์ของ Aspose สามารถเปลี่ยนขนาดได้หลังจากการเปิดใช้งานครั้งแรก สิ่งนี้อาจทำให้เกิดความแตกต่างที่สังเกตได้ในลักษณะของแผนภูมิก่อนและหลังการเปิดใช้งาน บทความนี้อธิบายเหตุผลที่เกิดการปรับขนาดและแสดงวิธีป้องกันโดยการจับคู่ขนาดแผนภูมิคงที่กับกรอบ OLE
ใน Create Excel Charts and Embed Them as OLE Objects in Presentations เราอธิบายวิธีสร้างแผนภูมิ Excel ด้วย Aspose.Cells for C++ และฝังลงในงานนำเสนอ PowerPoint โดยใช้ Aspose.Slides for C++. เพื่อแก้ไขปัญหา object preview issue เราได้กำหนดภาพแผนภูมิให้กับกรอบวัตถุ OLE ของแผนภูมิ. ในงานนำเสนอผลลัพธ์ เมื่อคุณดับเบิลคลิกที่กรอบวัตถุ OLE ที่แสดงภาพแผนภูมิ แผนภูมิ Excel จะถูกเปิดใช้งาน ผู้ใช้สามารถแก้ไขเวิร์กบุ๊ก Excel ที่ฝังอยู่และจากนั้นกลับไปยังสไลด์โดยคลิกนอกเวิร์กบุ๊กที่เปิดใช้งาน ขนาดของกรอบวัตถุ OLE จะเปลี่ยนแปลงเมื่อผู้ใช้กลับไปยังสไลด์ และปัจจัยการปรับขนาดจะแตกต่างกันขึ้นอยู่กับขนาดเดิมของกรอบวัตถุ OLE และเวิร์กบุ๊ก Excel ที่ฝังอยู่
Cause of Resizing
เวิร์กบุ๊ก Excel ที่ฝังอยู่มีขนาดหน้าต่างของตนเอง ซึ่ง Excel พยายามรักษาขนาดนั้นเมื่อวัตถุถูกเปิดใช้งานครั้งแรก กรอบ OLE บนสไลด์มีขนาดที่กำหนดแยกออกมา เมื่อเวิร์กบุ๊ก Excel ถูกเปิดใช้งาน, Excel และ PowerPoint จะเจรจาขนาดของวัตถุเพื่อรักษาสัดส่วนเป็นส่วนหนึ่งของกระบวนการฝัง ความแตกต่างระหว่างหน้าต่างเวิร์กบุ๊กและกรอบ OLE จึงอาจทำให้วัตถุปรับขนาด
Working Solution
จับคู่ขนาดแผนภูมิกับกรอบ OLE บนสไลด์และทำให้ขนาดแผนภูมิเป็นอิสระจากหน้าต่างเวิร์กบุ๊ก วิธีแก้ปัญหานี้ทำงานกับงานนำเสนอใหม่หรือเทมเพลตที่มีอยู่ ตัวอย่างนี้ต้องใช้ Aspose.Cells for C++ และ Aspose.Slides for C++. มันสร้างแผนภูมิคอลัมน์ง่ายบนแผ่นแผนภูมิที่ทำงานอยู่และฝังเวิร์กบุ๊กในรูปแบบ XLS ไม่มีการกำหนดภาพแสดงตัวอย่างของแผนภูมิ; แผนภูมิจะปรากฏเมื่อวัตถุ OLE ถูกเปิดใช้งานใน PowerPoint
วางโค้ดตัวอย่างในจุดเริ่มต้นของแอปพลิเคชันของคุณ โดยมีการประกาศ include ที่ระดับไฟล์ เริ่มต้น Aspose.Cells ก่อนสร้างอ็อบเจ็กต์ของมันและปลดปล่อยทรัพยากรหลังจากอ็อบเจ็กต์เหล่านั้นถูกทำลาย ตัวอย่างจะคัดลอกเวกเตอร์ไบต์ของเวิร์กบุ๊กที่ Aspose.Cells คืนค่าไปยังอาร์เรย์ประเภทที่ Aspose.Slides ยอมรับ
ตัวอย่างสร้างงานนำเสนอใหม่ที่มีกรอบ OLE ขนาด 9.5 × 4 นิ้ว วางตำแหน่งห่างจากขอบซ้าย 0.5 นิ้วและจากด้านบน 1 นิ้ว พิกัดและขนาดของสไลด์ใช้หน่วยพอยต์ (72 พอยต์ต่อหนึ่งนิ้ว) หากเป็นงานนำเสนอที่มีอยู่แล้ว ดูที่ Use a Template.
Set a Fixed Chart Size
Set Chart::SetSizeWithWindow to false so that the chart dimensions are independent of the workbook window. ตั้งค่า Chart::SetSizeWithWindow เป็น false เพื่อให้ขนาดแผนภูมิเป็นอิสระจากหน้าต่างเวิร์กบุ๊ก
Set the Chart::GetChartObject dimensions through Shape::SetWidth and Shape::SetHeight, converting points to pixels using 96 pixels per inch: a frame measuring 684 × 288 points corresponds to a chart measuring 912 × 384 pixels. ตั้งค่าขนาดของ Chart::GetChartObject ผ่าน Shape::SetWidth และ Shape::SetHeight โดยแปลงจากพอยต์เป็นพิกเซลโดยใช้ 96 พิกเซลต่อหนึ่งนิ้ว: กรอบที่มีขนาด 684 × 288 พอยต์จะเทียบเท่ากับแผนภูมิขนาด 912 × 384 พิกเซล
Set Chart::SetPrintSize to the Custom value of PrintSizeType. ตั้งค่า Chart::SetPrintSize ให้เป็นค่า Custom ของ PrintSizeType
The example embeds the workbook with IShapeCollection::AddOleObjectFrame and saves a presentation with a 9.5 × 4-inch OLE frame. ตัวอย่างฝังเวิร์กบุ๊กด้วย IShapeCollection::AddOleObjectFrame และบันทึกงานนำเสนอที่มีกรอบ OLE ขนาด 9.5 × 4 นิ้ว
#include "Aspose.Cells/Cell.h"
#include "Aspose.Cells/Cells.h"
#include "Aspose.Cells/Chart.h"
#include "Aspose.Cells/ChartCollection.h"
#include "Aspose.Cells/ChartShape.h"
#include "Aspose.Cells/ChartType.h"
#include "Aspose.Cells/Initializer.h"
#include "Aspose.Cells/PrintSizeType.h"
#include "Aspose.Cells/SaveFormat.h"
#include "Aspose.Cells/SeriesCollection.h"
#include "Aspose.Cells/SheetType.h"
#include "Aspose.Cells/Vector.h"
#include "Aspose.Cells/Workbook.h"
#include "Aspose.Cells/Worksheet.h"
#include "Aspose.Cells/WorksheetCollection.h"
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <Ole/OleEmbeddedDataInfo.h>
#include <system/array.h>
#include <system/smart_ptr.h>
#include <algorithm>
#include <cstdint>
using namespace Aspose::Slides;
using namespace Aspose::Slides::DOM::Ole;
Aspose::Cells::Startup();
{
Aspose::Cells::Workbook workbook;
auto dataSheet = workbook.GetWorksheets().Get(0);
dataSheet.SetName(u"Data");
dataSheet.GetCells().Get(u"A1").PutValue(10);
dataSheet.GetCells().Get(u"A2").PutValue(20);
auto chartSheetIndex = workbook.GetWorksheets().Add(Aspose::Cells::SheetType::Chart);
auto chartSheet = workbook.GetWorksheets().Get(chartSheetIndex);
auto chartIndex = chartSheet.GetCharts().Add(Aspose::Cells::Charts::ChartType::Column, 0, 0, 20, 10);
auto chart = chartSheet.GetCharts().Get(chartIndex);
chart.GetNSeries().Add(u"Data!A1:A2", true);
workbook.GetWorksheets().SetActiveSheetIndex(chartSheetIndex);
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
// พิกัดและขนาดของสไลด์ใช้หน่วยพอยต์ (72 พอยต์ต่อหนึ่งนิ้ว).
auto width = 684.f; // 9.5 นิ้ว.
auto height = 288.f; // 4 นิ้ว.
chart.SetSizeWithWindow(false);
// แปลงพอยต์เป็นพิกเซลของแผนภูมิโดยใช้ 96 พิกเซลต่อหนึ่งนิ้ว.
chart.GetChartObject().SetWidth(static_cast<int32_t>(width / 72.f * 96.f));
chart.GetChartObject().SetHeight(static_cast<int32_t>(height / 72.f * 96.f));
chart.SetPrintSize(Aspose::Cells::PrintSizeType::Custom);
auto workbookData = workbook.Save(Aspose::Cells::SaveFormat::Excel97To2003);
// คัดลอกเวกเตอร์ไบต์ของ Cells ไปยังชนิดอาร์เรย์ที่ Slides ยอมรับ.
auto workbookBytes = System::MakeArray<uint8_t>(workbookData.GetLength(), 0);
std::copy(workbookData.GetData(), workbookData.GetData() + workbookData.GetLength(), workbookBytes->data_ptr());
auto dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookBytes, u"xls");
slide->get_Shapes()->AddOleObjectFrame(36, 72, width, height, dataInfo);
presentation->Save(u"chart-fixed-size.pptx", Aspose::Slides::Export::SaveFormat::Pptx);
presentation->Dispose();
}
Aspose::Cells::Cleanup();
Use a Template
ตรรกะการกำหนดขนาดเหมือนกันสำหรับงานนำเสนอที่มีอยู่แล้ว เพื่อปรับตัวอย่างให้เข้ากับ:
- โหลดงานนำเสนอเทมเพลตแทนการสร้างงานนำเสนอเปล่า
- ตรวจสอบว่าหนังสือสไลด์แรกมีรูปร่างอย่างน้อยสามรูป แล้วใช้รูปร่างที่ดัชนี 2เป็นตำแหน่งตัวแทน
- นำความกว้างและความสูงของกรอบจากรูปร่างนั้นแทนการใช้ค่าคงที่ 684 และ 288. คำนวณขนาดให้คงเดิม
- เพิ่มกรอบ OLE ที่ตำแหน่งของตัวแทนแทนการใช้พิกัดคงที่ 36 และ 72
- ลบตัวแทนก่อนบันทึกงานนำเสนอ
FAQ
ทำไมแผนภูมิ Excel ที่ฝังอยู่ของฉันจึงเปลี่ยนขนาดหลังจากเปิดใช้งานใน PowerPoint?
สิ่งนี้เกิดขึ้นเนื่องจาก Excel พยายามคืนขนาดหน้าต่างเดิมเมื่อเปิดใช้งานครั้งแรก, ขณะที่กรอบวัตถุ OLE ใน PowerPoint มีขนาดของตนเอง PowerPoint และ Excel จะเจรจาขนาดเพื่อรักษาอัตราส่วนภาพ ซึ่งอาจทำให้เกิดการปรับขนาด
ฉันจะทำอย่างไรให้ขนาดของแผนภูมิและกรอบ OLE สอดคล้องกัน?
กำหนดขนาดแผนภูมิคงที่ที่ตรงกับกรอบ OLE และใช้ขนาดการพิมพ์แผนภูมิกำหนดเองก่อนฝังเวิร์กบุ๊ก ตัวอย่างข้างต้นแสดงการตั้งค่าที่จำเป็นและการแปลงหน่วย
การจับคู่ขนาดหน้าต่างเวิร์กบุ๊กเพียงอย่างเดียวเพียงพอหรือไม่?
การจับคู่ขนาดหน้าต่างเวิร์กบุ๊กเพียงอย่างเดียวไม่ได้ป้องกันการเปลี่ยนขนาดของกรอบ OLE หลังจากเปิดใช้งานอย่างเชื่อถือได้ ใช้ขนาดแผนภูมิคงที่ตามที่แสดงในตัวอย่าง
วิธีแก้ปัญหานี้ทำงานกับงานนำเสนอที่ใช้เทมเพลตและงานนำเสนอใหม่หรือไม่?
ใช่ สำหรับเทมเพลต ใช้ขนาดและตำแหน่งของตัวแทน สำหรับงานนำเสนอใหม่ ให้ระบุกรอบและตำแหน่งโดยตรง
ฉันสามารถใช้ตัวอย่างนี้กับแผนภูมิที่สร้างจากโปรแกรมสเปรดชีตอื่นได้หรือไม่?
ตัวอย่างใช้เวิร์กบุ๊ก Excel ที่สร้างด้วย Aspose.Cells ไม่ได้แสดงพฤติกรรมการเปิดใช้งานสำหรับโปรแกรมสเปรดชีตอื่น