วิธีแก้ไขที่ทำงานสำหรับการปรับขนาดแผนภูมิใน PPTX
พื้นหลัง
มีการสังเกตว่าแผนภูมิ Excel ที่ฝังเป็นวัตถุ OLE ในงานนำเสนอ PowerPoint ผ่านคอมโพเนนต์ของ Aspose จะถูกปรับขนาดเป็นสเกลที่ไม่ระบุหลังจากการเรียกใช้ครั้งแรก พฤติกรรมนี้ทำให้เกิดความแตกต่างที่เห็นได้ชัดในงานนำเสนอระหว่างสถานะก่อนและหลังการเรียกใช้แผนภูมิ ทีมงาน Aspose ได้ตรวจสอบปัญหาอย่างละเอียดและพบวิธีแก้ไข บทความนี้อธิบายสาเหตุของปัญหาและการแก้ไขที่สอดคล้องกัน
ในบทความก่อนหน้า, เราได้อธิบายวิธีสร้างแผนภูมิ Excel ด้วย Aspose.Cells for Java และฝังลงในงานนำเสนอ PowerPoint โดยใช้ Aspose.Slides for Java เพื่อจัดการกับปัญหาการแสดงตัวอย่างวัตถุ เราได้กำหนดภาพแผนภูมิให้กับกรอบวัตถุ OLE ของแผนภูมิ ในงานนำเสนอผลลัพธ์เมื่อคุณดับเบิลคลิกที่กรอบวัตถุ OLE ที่แสดงภาพแผนภูมิ แผนภูมิ Excel จะถูกเรียกใช้ ผู้ใช้ขั้นสุดท้ายสามารถทำการเปลี่ยนแปลงใด ๆ ที่ต้องการในสมุดงาน Excel ภายในและจากนั้นกลับไปยังสไลด์ที่สอดคล้องโดยคลิกนอกสมุดงานที่ถูกเรียกใช้งาน ขนาดของกรอบวัตถุ OLE จะเปลี่ยนแปลงเมื่อผู้ใช้กลับไปยังสไลด์ และปัจจัยการปรับขนาดจะแตกต่างกันขึ้นอยู่กับขนาดเริ่มต้นของกรอบวัตถุ OLE และสมุดงาน Excel ที่ฝังอยู่
สาเหตุของการปรับขนาด
เนื่องจากสมุดงาน Excel มีขนาดหน้าต่างของตนเอง มันพยายามรักษาขนาดเดิมไว้ในการเรียกใช้ครั้งแรก อย่างไรก็ตามกรอบวัตถุ OLE มีขนาดของตนเอง ตามข้อมูลจาก Microsoft เมื่อสมุดงาน Excel ถูกเรียกใช้ Excel และ PowerPoint จะเจรจาขนาดและรักษาสัดส่วนที่ถูกต้องเป็นส่วนหนึ่งของกระบวนการฝัง ขึ้นอยู่กับความแตกต่างระหว่างขนาดหน้าต่าง Excel กับขนาดหรือตำแหน่งของกรอบวัตถุ OLE จะเกิดการปรับขนาด
วิธีแก้ไขที่ทำงาน
มีสองสถานการณ์ที่เป็นไปได้สำหรับการสร้างงานนำเสนอ PowerPoint โดยใช้ Aspose.Slides for Java
Scenario 1: สร้างงานนำเสนอจากเทมเพลตที่มีอยู่
Scenario 2: สร้างงานนำตั้งแต่เริ่มต้น
วิธีแก้ที่เรานำเสนอที่นี่ใช้ได้กับทั้งสองสถานการณ์ พื้นฐานของแนวทางการแก้ทั้งหมดเหมือนกัน: ขนาดหน้าต่างของวัตถุ OLE ที่ฝังควรตรงกับกรอบวัตถุ OLE ในสไลด์ PowerPoint เราจะอธิบายสองแนวทางในการแก้ไขนี้
แนวทางแรก
ในแนวทางนี้ เราจะเรียนรู้วิธีตั้งค่าขนาดหน้าต่างของสมุดงาน Excel ที่ฝังให้ตรงกับขนาดของกรอบวัตถุ OLE ในสไลด์ PowerPoint
Scenario 1
สมมติว่าเรากำหนดเทมเพลตและต้องการสร้างงานนำเสนอจากเทมเพลตนี้ สมมติว่ามีรูปร่างที่ตำแหน่งดัชนี 2 ในเทมเพลตที่เราต้องการวางกรอบ OLE ที่มีสมุดงาน Excel ฝังไว้ ในสถานการณ์นี้ ขนาดของกรอบวัตถุ OLE ถูกกำหนดไว้ล่วงหน้า—ตรงกับขนาดของรูปร่างที่ตำแหน่งดัชนี 2 ในเทมเพลต สิ่งที่เราต้องทำคือกำหนดขนาดหน้าต่างของสมุดงานให้เท่ากับขนาดของรูปร่างดังกล่าว โค้ดตัวอย่างต่อไปนี้ทำหน้าที่ดังกล่าว:
// กำหนดความกว้างของหน้าต่างของสมุดงานเป็นนิ้ว (หารด้วย 576 เนื่องจาก PowerPoint ใช้ 576 พิกเซลต่อ นิ้ว)
workbook.getSettings().setWindowWidthInch(slide.getShapes().get_Item(2).getWidth() / 72f);
// กำหนดความสูงของหน้าต่างของสมุดงานเป็นนิ้ว
workbook.getSettings().setWindowHeightInch(slide.getShapes().get_Item(2).getHeight() / 72f);
// บันทึกสมุดงานไปยังสตรีมหน่วยความจำ
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
// สร้างกรอบวัตถุ OLE พร้อมข้อมูล Excel ที่ฝังอยู่
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
slide.getShapes().get_Item(2).getX(),
slide.getShapes().get_Item (2).getY(),
slide.getShapes().get_Item (2).getWidth(),
slide.getShapes().get_Item (2).getHeight(),
"Excel.Sheet.8",
workbookStream.toByteArray());
Scenario 2
สมมติว่าเราต้องการสร้างงานนำเสนอจากศูนย์และรวมกรอบวัตถุ OLE ขนาดใดก็ได้พร้อมสมุดงาน Excel ที่ฝังไว้ ในโค้ดตัวอย่างต่อไปนี้ เราจะสร้างกรอบวัตถุ OLE ความสูง 4 นิ้ว ความกว้าง 9.5 นิ้ว ที่ตำแหน่ง x = 0.5 นิ้ว และ y = 1 นิ้วบนสไลด์ จากนั้นเราจะตั้งค่าหน้าต่างสมุดงาน Excel ให้มีขนาดเดียวกัน—ความสูง 4 นิ้ว ความกว้าง 9.5 นิ้ว
// ความสูงที่ต้องการของเรา.
int desiredHeight = 288; // 4 นิ้ว (4 * 72)
// ความกว้างที่ต้องการของเรา.
int desiredWidth = 684; // 9.5 นิ้ว (9.5 * 72)
// กำหนดขนาดแผนภูมิด้วยหน้าต่าง.
chart.setSizeWithWindow(true);
// กำหนดความกว้างของหน้าต่างสมุดงานเป็นนิ้ว (หารด้วย 576 เนื่องจาก PowerPoint ใช้ 576 พิกเซลต่อ นิ้ว).
workbook.getSettings().setWindowWidthInch(desiredHeight / 72f);
// กำหนดความสูงของหน้าต่างสมุดงานเป็นนิ้ว.
workbook.getSettings().setWindowHeightInch(desiredWidth / 72f);
// บันทึกสมุดงานไปยังสตรีมหน่วยความจำ.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
// สร้างกรอบวัตถุ OLE พร้อมข้อมูล Excel ที่ฝังอยู่.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
288,
576,
desiredWidth,
desiredHeight,
"Excel.Sheet.8",
workbookStream.toByteArray());
แนวทางที่สอง
ในแนวทางนี้ เราจะเรียนรู้วิธีตั้งค่าขนาดของแผนภูมิในสมุดงาน Excel ที่ฝังให้ตรงกับขนาดของกรอบวัตถุ OLE ในสไลด์ PowerPoint แนวทางนี้เป็นประโยชน์เมื่อขนาดแผนภูมิทราบล่วงหน้าและจะไม่เปลี่ยนแปลง
Scenario 1
สมมติว่าเรากำหนดเทมเพลตและต้องการสร้างงานนำเสนอจากเทมเพลตนี้ สมมติว่ามีรูปร่างที่ตำแหน่งดัชนี 2 ในเทมเพลตที่เราตั้งใจวางกรอบ OLE ที่มีสมุดงาน Excel ฝังไว้ ในสถานการณ์นี้ ขนาดของกรอบ OLE ถูกกำหนดไว้ล่วงหน้า—ตรงกับขนาดของรูปร่างที่ตำแหน่งดัชนี 2 ในเทมเพลต สิ่งที่เราต้องทำคือกำหนดขนาดแผนภูมิในสมุดงานให้เท่ากับขนาดของรูปร่างดังกล่าว โค้ดตัวอย่างต่อไปนี้ทำหน้าที่ดังกล่าว:
// กำหนดขนาดแผนภูมิโดยไม่มีหน้าต่าง.
chart.setSizeWithWindow(false);
// ตั้งค่าความกว้างของแผนภูมิเป็นพิกเซล (คูณด้วย 96 เนื่องจาก Excel ใช้ 96 พิกเซลต่อ นิ้ว).
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 72f) * 96f));
// ตั้งค่าความสูงของแผนภูมิเป็นพิกเซล.
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 72f) * 96f));
// กำหนดขนาดการพิมพ์ของแผนภูมิ.
chart.setPrintSize(PrintSizeType.CUSTOM);
// บันทึกสมุดงานไปยังสตรีมหน่วยความจำ.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
// สร้างกรอบวัตถุ OLE พร้อมข้อมูล Excel ที่ฝังอยู่.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
slide.getShapes().get_Item(2).getX(),
slide.getShapes().get_Item (2).getY(),
slide.getShapes().get_Item (2).getWidth(),
slide.getShapes().get_Item (2).getHeight(),
"Excel.Sheet.8",
workbookStream.toByteArray());
Scenario 2:
สมมติว่าเราต้องการสร้างงานนำเสนอจากศูนย์และรวมกรอบวัตถุ OLE ขนาดใดก็ได้พร้อมสมุดงาน Excel ที่ฝังไว้ ในโค้ดตัวอย่างต่อไปนี้ เราจะสร้างกรอบวัตถุ OLE ความสูง 4 นิ้วนและความกว้าง 9.5 นิ้วนบนสไลด์ที่ตำแหน่ง x = 0.5 นิ้ว และ y = 1 นิ้ว เราจะตั้งค่าขนาดแผนภูมิที่สอดคล้องให้มีขนาดเดียวกัน: ความสูง 4 นิ้ว และความกว้าง 9.5 นิ้ว
// ความสูงที่ต้องการของเรา.
int desiredHeight = 288; // 4 นิ้ว (4 * 72)
// ความกว้างที่ต้องการของเรา.
int desiredWidth = 684; // 9.5 นิ้ว (9.5 * 72)
// กำหนดขนาดแผนภูมิโดยไม่มีหน้าต่าง.
chart.setSizeWithWindow(false);
// ตั้งค่าความกว้างของแผนภูมิเป็นพิกเซล (คูณด้วย 96 เนื่องจาก Excel ใช้ 96 พิกเซลต่อ นิ้ว).
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 576f) * 96f));
// ตั้งค่าความสูงของแผนภูมิเป็นพิกเซล.
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 576f) * 96f));
// บันทึกสมุดงานไปยังสตรีมหน่วยความจำ.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
// สร้างกรอบวัตถุ OLE พร้อมข้อมูล Excel ที่ฝังอยู่.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
288,
576,
desiredWidth,
desiredHeight,
"Excel.Sheet.8",
workbookStream.toByteArray());
สรุป
มีสองแนวทางในการแก้ไขปัญหาการปรับขนาดแผนภูมิ การเลือกแนวทางขึ้นอยู่กับความต้องการและกรณีการใช้งาน ทั้งสองแนวทางทำงานในลักษณะเดียวกันไม่ว่าจะสร้างงานนำเสนอจากเทมเพลตหรือจากศูนย์ นอกจากนี้ไม่มีขีดจำกัดขนาดของกรอบวัตถุ OLE ในวิธีแก้นี้
คำถามที่พบบ่อย
ทำไมแผนภูมิ Excel ที่ฝังอยู่ของฉันจึงเปลี่ยนขนาดหลังจากเปิดใช้งานใน PowerPoint?
เหตุการณ์นี้เกิดขึ้นเนื่องจาก Excel พยายามคืนขนาดหน้าต่างเดิมเมื่อเปิดใช้งานครั้งแรก ในขณะที่กรอบวัตถุ OLE ใน PowerPoint มีขนาดของตนเอง PowerPoint และ Excel จะเจรจากันเกี่ยวกับขนาดเพื่อรักษาอัตราส่วนภาพ ซึ่งอาจทำให้เกิดการปรับขนาด
สามารถป้องกันปัญหาการปรับขนาดนี้ได้อย่างสมบูรณ์หรือไม่?
ได้. โดยการทำให้ขนาดหน้าต่างของสมุดงาน Excel หรือขนาดแผนภูมิตรงกับขนาดของกรอบวัตถุ OLE ก่อนการฝัง คุณสามารถรักษาขนาดของแผนภูมิให้คงที่ได้
ฉันควรเลือกใช้แนวทางใด ระหว่างการตั้งค่าขนาดหน้าต่างของสมุดงานหรือการตั้งค่าขนาดแผนภูมิ?
ใช้ Approach 1 (window size) หากคุณต้องการรักษาอัตราส่วนของสมุดงานและอาจอนุญาตให้ปรับขนาดในภายหลัง ใช้ Approach 2 (chart size) หากขนาดของแผนภูมิเป็นค่าคงที่และจะไม่เปลี่ยนแปลงหลังการฝัง
วิธีเหล่านี้จะทำงานได้กับงานนำเสนอที่สร้างจากเทมเพลตและงานนำเสนอใหม่หรือไม่?
ใช่. ทั้งสองแนวทางทำงานในลักษณะเดียวกันสำหรับงานนำเสนอที่สร้างจากเทมเพลตและจากศูนย์
มีขีดจำกัดขนาดของกรอบวัตถุ OLE หรือไม่?
ไม่มี. คุณสามารถกำหนดขนาดกรอบ OLE ให้เป็นขนาดใดก็ได้ตราบใดที่สัดส่วนกับสมุดงานหรือแผนภูมิอย่างเหมาะสม
ฉันสามารถใช้วิธีเหล่านี้กับแผนภูมิที่สร้างในโปรแกรมสเปรดชีตอื่นได้หรือไม่?
ตัวอย่างออกแบบมาสำหรับแผนภูมิ Excel ที่สร้างด้วย Aspose.Cells แต่หลักการสามารถนำไปใช้กับโปรแกรมสเปรดชีตอื่นที่รองรับ OLE ได้ ตราบใดที่โปรแกรมเหล่านั้นสนับสนุนตัวเลือกการกำหนดขนาดที่คล้ายกัน