วิธีแก้ไขปัญหาการปรับขนาดแผนภูมิใน PPTX

พื้นหลัง

พบว่าแผนภูมิ Excel ที่ฝังเป็นอ็อบเจกต์ OLE ในนำเสนอ PowerPoint ผ่านคอมโพเนนต์ของ Aspose จะถูกปรับขนาดเป็นสเกลที่ไม่ระบุหลังจากเปิดใช้งานครั้งแรก พฤติกรรมนี้ทำให้เกิดความแตกต่างด้านภาพที่สังเกตได้ระหว่างสถานะก่อนและหลังการเปิดใช้งานของแผนภูมิ ทีมงาน Aspose ได้สอบสวนปัญหาอย่างละเอียดและพบวิธีแก้ไข บทความนี้อธิบายสาเหตุของปัญหาและการแก้ไขที่สอดคล้อง

ในบทความก่อนหน้า, เราได้อธิบายวิธีสร้างแผนภูมิ Excel ด้วย Aspose.Cells for .NET และฝังลงในนำเสนอ PowerPoint โดยใช้ Aspose.Slides for .NET เพื่อแก้ไขปัญหาการแสดงตัวอย่างอ็อบเจกต์, เราได้กำหนดรูปภาพแผนภูมิให้กับกรอบอ็อบเจกต์ OLE ของแผนภูมิ ในการนำเสนอผลลัพธ์ เมื่อคุณดับเบิลคลิกที่กรอบอ็อบเจกต์ OLE ที่แสดงรูปภาพแผนภูมิ แผนภูมิ Excel จะถูกเปิดใช้งาน ผู้ใช้ขั้นสุดท้ายสามารถทำการเปลี่ยนแปลงใด ๆ ที่ต้องการในเวิร์กบุ๊ก Excel ที่อยู่ด้านล่าง แล้วกลับไปยังสไลด์ที่เกี่ยวข้องโดยคลิกนอกเวิร์กบุ๊กที่เปิดใช้งาน ขนาดของกรอบอ็อบเจกต์ OLE จะเปลี่ยนแปลงเมื่อผู้ใช้กลับสู่สไลด์ และอัตราการปรับขนาดจะแตกต่างขึ้นอยู่กับขนาดเริ่มต้นของกรอบอ็อบเจกต์ OLE และเวิร์กบุ๊ก Excel ที่ฝังอยู่

สาเหตุของการปรับขนาด

เนื่องจากเวิร์กบุ๊ก Excel มีขนาดหน้าต่างของตนเอง มันจึงพยายามรักษาขนาดเดิมไว้เมื่อเปิดใช้งานครั้งแรก อย่างไรก็ตามกรอบอ็อบเจกต์ OLE มีขนาดของมันเอง ตามที่ Microsoft ระบุ เมื่อเวิร์กบุ๊ก Excel ถูกเปิดใช้งาน Excel และ PowerPoint จะเจรจากันเกี่ยวกับขนาดและคงอัตราส่วนที่ถูกต้องเป็นส่วนหนึ่งของกระบวนการฝัง ขึ้นอยู่กับความแตกต่างระหว่างขนาดหน้าต่าง Excel กับขนาดหรือตำแหน่งของกรอบอ็อบเจกต์ OLE การปรับขนาดจึงเกิดขึ้น

วิธีแก้ไขที่ทำงาน

มีสองสถานการณ์ที่เป็นไปได้สำหรับการสร้างการนำเสนอ PowerPoint โดยใช้ Aspose.Slides for .NET
Scenario 1: สร้างการนำเสนอจากเทมเพลตที่มีอยู่แล้ว.
Scenario 2: สร้างการนำเสนอจากศูนย์.

วิธีแก้ที่เรานำเสนอที่นี่ใช้ได้กับทั้งสองสถานการณ์ พื้นฐานของทุกแนวทางการแก้คือเดียวกัน: ขนาดหน้าต่างของอ็อบเจกต์ OLE ที่ฝังควรตรงกับกรอบอ็อบเจกต์ OLE ในสไลด์ PowerPoint เราจะอธิบายแนวทางสองทางต่อไปนี้

แนวทางแรก

ในแนวทางนี้ เราจะเรียนรู้วิธีตั้งค่าขนาดหน้าต่างของเวิร์กบุ๊ก Excel ที่ฝังให้ตรงกับขนาดของกรอบอ็อบเจกต์ OLE ในสไลด์ PowerPoint.

Scenario 1

สมมติว่าเราได้กำหนดเทมเพลตและต้องการสร้างการนำเสนอจากมัน สมมติว่ามีรูปร่างที่ตำแหน่งที่ 2 ในเทมเพลตที่เราต้องการวางกรอบ OLE ที่มีเวิร์กบุ๊ก Excel ฝังอยู่ ในสถานการณ์นี้ ขนาดของกรอบอ็อบเจกต์ OLE ถูกกำหนดไว้ล่วงหน้า—มันตรงกับขนาดของรูปร่างที่ตำแหน่งที่ 2 ในเทมเพลต สิ่งที่เราต้องทำคือกำหนดขนาดหน้าต่างของเวิร์กบุ๊กให้เท่ากับขนาดของรูปร่างดังกล่าว โค้ดตัวอย่างต่อไปนี้ทำหน้าที่นั้น:

// กำหนดขนาดแผนภูมิพร้อมหน้าต่าง. 
chart.SizeWithWindow = true;

// ตั้งค่าความกว้างของหน้าต่างเวิร์กบุ๊กเป็นนิ้ว (หารด้วย 72 เนื่องจาก PowerPoint ใช้ 72 พิกเซลต่อหนึ่งนิ้ว).
workbook.Worksheets.WindowWidthInch = slide.Shapes[2].Width / 72f;

// ตั้งค่าความสูงของหน้าต่างเวิร์กบุ๊กเป็นนิ้ว.
workbook.Worksheets.WindowHeightInch = slide.Shapes[2].Height / 72f;

// บันทึกเวิร์กบุ๊กลงในสตรีมหน่วยความจำ.
MemoryStream workbookStream = workbook.SaveToStream();

// สร้างเฟรมอ็อบเจกต์ OLE พร้อมข้อมูล Excel ที่ฝังอยู่.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
    slide.Shapes[2].X,
    slide.Shapes[2].Y,
    slide.Shapes[2].Width,
    slide.Shapes[2].Height,
	"Excel.Sheet.8",
	workbookStream.ToArray());

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.SizeWithWindow = true;

// ตั้งค่าความกว้างของหน้าต่างเวิร์กบุ๊กเป็นนิ้ว.
workbook.Worksheets.WindowWidthInch = desiredWidth / 72f;

// ตั้งค่าความสูงของหน้าต่างเวิร์กบุ๊กเป็นนิ้ว.
workbook.Worksheets.WindowHeightInch = desiredHeight / 72f;

// บันทึกเวิร์กบุ๊กลงในสตรีมหน่วยความจำ.
MemoryStream workbookStream = workbook.SaveToStream();

// สร้างเฟรมอ็อบเจกต์ OLE พร้อมข้อมูล Excel ที่ฝังอยู่.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
    36,
    72,
    desiredWidth,
    desiredHeight,
	"Excel.Sheet.8",
	workbookStream.ToArray());

แนวทางที่สอง

ในแนวทางนี้ เราจะเรียนรู้วิธีตั้งค่าขนาดของแผนภูมิในเวิร์กบุ๊ก Excel ที่ฝังให้ตรงกับขนาดของกรอบอ็อบเจกต์ OLE ในสไลด์ PowerPoint แนวทางนี้มีประโยชน์เมื่อทราบขนาดแผนภูมิล่วงหน้าและจะไม่มีการเปลี่ยนแปลง

Scenario 1

สมมติว่าเราได้กำหนดเทมเพลตและต้องการสร้างการนำเสนอจากมัน สมมติว่ามีรูปร่างที่ตำแหน่งที่ 2 ในเทมเพลตที่เราตั้งใจวางกรอบ OLE ที่มีเวิร์กบุ๊ก Excel ฝังอยู่ ในสถานการณ์นี้ ขนาดของกรอบ OLE ถูกกำหนดไว้ล่วงหน้า—ตรงกับขนาดของรูปร่างที่ตำแหน่งที่ 2 ในเทมเพลต สิ่งที่เราต้องทำคือกำหนดขนาดของแผนภูมิในเวิร์กบุ๊กให้เท่ากับขนาดของรูปร่าง โค้ดตัวอย่างต่อไปนี้ทำหน้าที่นั้น:

// กำหนดขนาดแผนภูมิโดยไม่มีหน้าต่าง. 
chart.SizeWithWindow = false;

// กำหนดความกว้างของแผนภูมิเป็นพิกเซล (คูณด้วย 96 เนื่องจาก Excel ใช้ 96 พิกเซลต่อหนึ่งนิ้ว).    
chart.ChartObject.Width = (int)((slide.Shapes[2].Width / 72f) * 96f);

// กำหนดความสูงของแผนภูมิเป็นพิกเซล.
chart.ChartObject.Height = (int)((slide.Shapes[2].Height / 72f) * 96f);

// กำหนดขนาดการพิมพ์ของแผนภูมิ.
chart.PrintSize = PrintSizeType.Custom;

// บันทึกเวิร์กบุ๊กลงในสตรีมหน่วยความจำ.
MemoryStream workbookStream = workbook.SaveToStream();

// สร้างเฟรมอ็อบเจกต์ OLE พร้อมข้อมูล Excel ที่ฝังอยู่.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
    slide.Shapes[2].X,
    slide.Shapes[2].Y,
    slide.Shapes[2].Width,
    slide.Shapes[2].Height,
	"Excel.Sheet.8",
	workbookStream.ToArray());

Scenario 2

สมมติว่าเราต้องการสร้างการนำเสนอจากศูนย์และรวมกรอบอ็อบเจกต์ OLE ขนาดใดก็ได้พร้อมเวิร์กบุ๊ก Excel ฝังอยู่ ในโค้ดตัวอย่างต่อไปนี้ เราจะสร้างกรอบอ็อบเจกต์ OLE ที่มีความสูง 4 นิ้วและความกว้าง 9.5 นิ้วบนสไลด์ที่ตำแหน่ง x = 0.5 นิ้วและ y = 1 นิ้ว เราจะตั้งค่าขนาดแผนภูมิที่สอดคล้องให้มีมิติเดียวกัน: ความสูง 4 นิ้วและความกว้าง 9.5 นิ้ว.

 // ความสูงที่ต้องการ.
int desiredHeight = 288; // 4 นิ้ว (4 * 576)

 // ความกว้างที่ต้องการ.
int desiredWidth = 684; // 9.5 นิ้ว (9.5 * 576)

// กำหนดขนาดแผนภูมิโดยไม่มีหน้าต่าง. 
chart.SizeWithWindow = false;

// กำหนดความกว้างของแผนภูมิเป็นพิกเซล.   
chart.ChartObject.Width = (int)((desiredWidth / 72f) * 96f);

// กำหนดความสูงของแผนภูมิเป็นพิกเซล.    
chart.ChartObject.Height = (int)((desiredHeight / 72f) * 96f);

// บันทึกเวิร์กบุ๊กลงในสตรีมหน่วยความจำ.
MemoryStream workbookStream = workbook.SaveToStream();

// สร้างเฟรมอ็อบเจกต์ OLE พร้อมข้อมูล Excel ที่ฝังอยู่.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
    36,
    72,
    desiredWidth,
    desiredHeight,
	"Excel.Sheet.8",
	workbookStream.ToArray());

สรุป

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

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

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

สามารถป้องกันปัญหาการปรับขนาดนี้ได้โดยสมบูรณ์หรือไม่?
ได้ การจับคู่ขนาดหน้าต่างของเวิร์กบุ๊ก Excel หรือขนาดของแผนภูมิให้ตรงกับขนาดของกรอบอ็อบเจกต์ OLE ก่อนการฝัง จะทำให้ขนาดแผนภูมิคงที่

ควรเลือกแนวทางใด ระหว่างการตั้งค่าขนาดหน้าต่างของเวิร์กบุ๊กหรือการตั้งค่าขนาดของแผนภูมิ?
ใช้ Approach 1 (window size) หากคุณต้องการคงอัตราส่วนของเวิร์กบุ๊กและอาจอนุญาตให้ปรับขนาดในภายหลัง
ใช้ Approach 2 (chart size) หากขนาดของแผนภูมิกำหนดไว้แล้วและจะไม่เปลี่ยนแปลงหลังการฝัง

วิธีเหล่านี้จะทำงานได้กับการนำเสนอแบบอิงเทมเพลตและการนำเสนอใหม่หรือไม่?
ได้ ทั้งสองแนวทางทำงานเช่นเดียวกันสำหรับการนำเสนอที่สร้างจากเทมเพลตและจากศูนย์

มีขีดจำกัดขนาดของกรอบอ็อบเจกต์ OLE หรือไม่?
ไม่มี คุณสามารถตั้งค่ากรอบ OLE ให้มีขนาดใดก็ได้ตราบใดที่มันสเกลอย่างเหมาะสมกับขนาดของเวิร์กบุ๊กหรือแผนภูมิ

ฉันสามารถใช้วิธีเหล่านี้กับแผนภูมิที่สร้างในโปรแกรมสเปรดชีตอื่นได้หรือไม่?
ตัวอย่างถูกออกแบบสำหรับแผนภูมิ Excel ที่สร้างด้วย Aspose.Cells แต่หลักการเหล่านี้สามารถนำไปใช้กับโปรแกรมสเปรดชีตอื่นที่รองรับ OLE และมีตัวเลือกการกำหนดขนาดที่คล้ายกันได้

ส่วนที่เกี่ยวข้อง