วิธีแก้ปัญหาการปรับขนาดแผนภูมิใน PPTX
พื้นหลัง
แผนภูมิ Excel ที่ฝังเป็นวัตถุ OLE ในงานนำเสนอ PowerPoint โดยใช้ส่วนประกอบของ Aspose สามารถเปลี่ยนขนาดหลังจากการเปิดใช้งานครั้งแรกได้ ซึ่งอาจทำให้การแสดงผลของแผนภูมิมีความแตกต่างอย่างชัดเจนก่อนและหลังการเปิดใช้งาน บทความนี้อธิบายสาเหตุที่ทำให้ขนาดเปลี่ยนและแสดงวิธีป้องกันโดยการทำให้ขนาดแผนภูมิที่กำหนดคงที่ตรงกับกรอบ OLE
ในสร้างแผนภูมิ Excel และฝังเป็นวัตถุ OLE ในงานนำเสนอ เราอธิบายวิธีสร้างแผนภูมิ Excel ด้วย Aspose.Cells for Java และฝังลงในงานนำเสนอ PowerPoint ด้วย Aspose.Slides for Java เพื่อแก้ไขปัญหาการแสดงตัวอย่างวัตถุ เราได้กำหนดภาพแผนภูมิให้กับกรอบวัตถุ OLE ของแผนภูมิ ในงานนำเสนอที่ได้ผลลัพธ์เมื่อคุณดับเบิลคลิกที่กรอบวัตถุ OLE ที่แสดงภาพแผนภูมิ แผนภูมิ Excel จะถูกเปิดใช้งาน ผู้ใช้สามารถแก้ไขสมุดงาน Excel ที่ฝังอยู่แล้วกลับไปยังสไลด์โดยคลิกนอกสมุดงานที่เปิดใช้งาน ขนาดของกรอบวัตถุ OLE จะเปลี่ยนเมื่อผู้ใช้กลับไปยังสไลด์และปัจจัยการปรับขนาดจะแตกต่างกันขึ้นอยู่กับขนาดดั้งเดิมของกรอบวัตถุ OLE และสมุดงาน Excel ที่ฝังอยู่
สาเหตุของการเปลี่ยนขนาด
สมุดงาน Excel ที่ฝังอยู่มีขนาดหน้าต่างของตนเอง ซึ่ง Excel พยายามคงไว้เมื่อวัตถุถูกเปิดใช้งานครั้งแรก กรอบ OLE บนสไลด์มีขนาดที่กำหนดแยกจากกัน เมื่อสมุดงาน Excel ถูกเปิดใช้งาน Excel และ PowerPoint จะต่อรองขนาดของวัตถิเพื่อรักษาอัตราส่วนส่วนสูง-กว้างเป็นส่วนหนึ่งของกระบวนการฝัง ความแตกต่างระหว่างหน้าต่างสมุดงานและกรอบ OLE จึงอาจทำให้วัตถุปรับขนาดได้
วิธีแก้ปัญหาที่ทำงานได้
ทำให้ขนาดแผนภูมิตรงกับกรอบ OLE บนสไลด์และทำให้ขนาดแผนภูมิอิสระจากหน้าต่างสมุดงาน วิธีนี้ใช้ได้กับงานนำเสนอใหม่หรือเทมเพลตที่มีอยู่
ตัวอย่างต้องใช้ Aspose.Cells for Java และ Aspose.Slides for Java มันสร้างแผนภูมิคอลัมน์ง่ายบนชีตแผนภูมิที่ใช้งานอยู่และฝังสมุดงานในรูปแบบ XLS ไม่ได้กำหนดภาพแผนภูมิก่อนแสดง; แผนภูมิจะปรากฏเมื่อวัตถุ OLE ถูกเปิดใช้งานใน PowerPoint
ตัวอย่างสร้างงานนำเสนอใหม่ที่มีกรอบ OLE ขนาด 9.5 × 4 นิ้ว วางตำแหน่ง 0.5 นิ้วจากขอบซ้ายและ 1 นิ้วนับจากด้านบน พิกัดและขนาดของสไลด์ใช้หน่วยจุด (72 จุดต่อหนึ่งนิ้ว) สำหรับงานนำเสนอที่มีอยู่ ดูใช้เทมเพลต
ตั้งค่าขนาดแผนภูมิคงที่
ตั้งค่าsetSizeWithWindowเป็นfalseเพื่อให้ขนาดแผนภูมิอิสระจากหน้าต่างสมุดงาน กำหนดขนาดของgetChartObjectผ่านsetWidthและsetHeightโดยแปลงจากจุดเป็นพิกเซลที่ 96 พิกเซลต่อหนึ่งนิ้ว: กรอบที่วัดได้ 684 × 288 จุดสอดคล้องกับแผนภูมิที่วัดได้ 912 × 384 พิกเซล ตั้งค่าsetPrintSizeเป็นค่CUSTOMของPrintSizeType ตัวอย่างฝังกรอบด้วยaddOleObjectFrameและบันทึกงานนำเสนอที่มีกรอบ OLE ขนาด 9.5 × 4 นิ้ว
import com.aspose.cells.Chart;
import com.aspose.cells.ChartType;
import com.aspose.cells.FileFormatType;
import com.aspose.cells.PrintSizeType;
import com.aspose.cells.SheetType;
import com.aspose.cells.Workbook;
import com.aspose.cells.Worksheet;
import com.aspose.slides.ISlide;
import com.aspose.slides.OleEmbeddedDataInfo;
import com.aspose.slides.Presentation;
import com.aspose.slides.SaveFormat;
import java.io.ByteArrayOutputStream;
Workbook workbook = new Workbook();
try {
Worksheet dataSheet = workbook.getWorksheets().get(0);
dataSheet.setName("Data");
dataSheet.getCells().get("A1").putValue(10);
dataSheet.getCells().get("A2").putValue(20);
int chartSheetIndex = workbook.getWorksheets().add(SheetType.CHART);
Worksheet chartSheet = workbook.getWorksheets().get(chartSheetIndex);
int chartIndex = chartSheet.getCharts().add(ChartType.COLUMN, 0, 0, 20, 10);
Chart chart = chartSheet.getCharts().get(chartIndex);
chart.getNSeries().add("Data!A1:A2", true);
workbook.getWorksheets().setActiveSheetIndex(chartSheetIndex);
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
// พิกัดและขนาดของสไลด์ใช้หน่วยจุด (72 จุดต่อนิ้ว).
float width = 684f; // 9.5 นิ้ว.
float height = 288f; // 4 นิ้ว.
chart.setSizeWithWindow(false);
// แปลงจากจุดเป็นพิกเซลของแผนภูมิโดยใช้ 96 พิกเซลต่อหนึ่งนิ้ว.
chart.getChartObject().setWidth((int)(width / 72f * 96f));
chart.getChartObject().setHeight((int)(height / 72f * 96f));
chart.setPrintSize(PrintSizeType.CUSTOM);
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, FileFormatType.EXCEL_97_TO_2003);
OleEmbeddedDataInfo dataInfo = new OleEmbeddedDataInfo(workbookStream.toByteArray(), "xls");
slide.getShapes().addOleObjectFrame(36, 72, width, height, dataInfo);
presentation.save("chart-fixed-size.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
} finally {
workbook.dispose();
}
ใช้เทมเพลต
ตรรกะการกำหนดขนาดเหมือนกันสำหรับงานนำเสนอที่มีอยู่ เพื่อปรับตัวอย่างให้เข้ากับเทมเพลต:
- โหลดงานนำเสนอเทมเพลตแทนการสร้างงานนำเสนอเปล่า
- ตรวจสอบให้แน่ใจว่าสไลด์แรกมีรูปร่างอย่างน้อยสามรูป แล้วใช้รูปร่างที่ตำแหน่งดัชนี 2 เป็นตัวแทนที่จอด
- ดึงความกว้างและความสูงของกรอบจากรูปร่างนั้นแทนการใช้ค่าคงที่ 684 และ 288 คำนวณขนาดตามเดิม
- เพิ่มกรอบ OLE ที่ตำแหน่งของตัวแทนที่จอดแทนการใช้พิกัดคงที่ 36 และ 72
- ลบตัวแทนที่จอดก่อนบันทึกงานนำเสนอ
คำถามที่พบบ่อย
ทำไมแผนภูมิ Excel ที่ฝังอยู่จึงเปลี่ยนขนาดหลังจากเปิดใช้งานใน PowerPoint?
เหตุนี้เกิดจาก Excel พยายามคืนขนาดหน้าต่างเดิมเมื่อเปิดใช้งานครั้งแรก ในขณะที่กรอบวัตถุ OLE ใน PowerPoint มีขนาดของตนเอง PowerPoint และ Excel จะต่อรองขนาดเพื่อรักษาอัตราส่วน ซึ่งอาจทำให้ขนาดปรับเปลี่ยน
ฉันจะทำให้ขนาดของแผนภูมิและกรอบ OLE สอดคล้องกันได้อย่างไร?
กำหนดขนาดแผนภูมิคงที่ให้ตรงกับกรอบ OLE และใช้ขนาดการพิมพ์แผนภูมิแบบกำหนดเองก่อนฝังสมุดงาน ตัวอย่างด้านบนแสดงการตั้งค่าที่จำเป็นและการแปลงหน่วย
การทำให้ขนาดหน้าต่างสมุดงานตรงกันพอหรือไม่?
การทำให้ขนาดหน้าต่างสมุดงานตรงกันเพียงอย่างเดียวไม่สามารถป้องกันกรอบ OLE จากการเปลี่ยนขนาดหลังเปิดใช้งานได้อย่างเชื่อถือ ใช้ขนาดแผนภูมิคงที่ตามที่แสดงในตัวอย่าง
วิธีแก้ปัญหานี้ทำงานกับงานนำเสนอแบบเทมเพลตและงานนำเสนอใหม่หรือไม่?
ทำงานได้ ทั้งสำหรับเทมเพลต ให้ใช้ขนาดและตำแหน่งของตัวแทนที่จอด สำหรับงานนำเสนอใหม่ ให้ระบุขนาดและตำแหน่งของกรอบโดยตรง
ฉันสามารถใช้ตัวอย่างนี้กับแผนภูมิที่สร้างจากโปรแกรมสเปรดชีตอื่นได้หรือไม่?
ตัวอย่างใช้สมุดงาน Excel ที่สร้างด้วย Aspose.Cells ไม่ได้สาธิตพฤติกรรมการเปิดใช้งานสำหรับโปรแกรมสเปรดชีตอื่น