# Λύση Λειτουργίας για Αλλαγή Μεγέθους Διαγράμματος σε PPTX

> Διορθώστε την απροσδόκητη αλλαγή μεγέθους διαγράμματος σε PPTX όταν χρησιμοποιείτε ενσωματωμένα αντικείμενα Excel OLE με το Aspose.Slides for C++. Μάθετε δύο μεθόδους με κώδικα για να διατηρήσετε σταθερά τα μεγέθη.

Source: https://docs.aspose.com/slides/el/cpp/working-solution-for-chart-resizing-in-pptx/
Updated: 2026-06-09

## **Ιστορικό**

Παρατηρήθηκε ότι τα διαγράμματα Excel που ενσωματώνονται ως αντικείμενα OLE σε παρουσίαση PowerPoint μέσω των στοιχείων Aspose αλλάζουν μέγεθος σε άγνωστη κλίμακα μετά την πρώτη τους ενεργοποίηση. Αυτή η συμπεριφορά δημιουργεί ορατή διαφορά στην παρουσίαση μεταξύ της κατάστασης πριν και μετά την ενεργοποίηση του διαγράμματος. Η ομάδα του Aspose εξέτασε το ζήτημα λεπτομερώς και βρήκε μια λύση. Αυτό το άρθρο περιγράφει τις αιτίες του προβλήματος και την αντίστοιχη διόρθωση.

Στο [προηγούμενο άρθρο](/slides/el/cpp/creating-excel-chart-and-embedding-it-in-presentation-as-ole-object/), εξηγήσαμε πώς να δημιουργήσουμε ένα διάγραμμα Excel με το Aspose.Cells for C++ και να το ενσωματώσουμε σε παρουσίαση PowerPoint χρησιμοποιώντας το Aspose.Slides for C++. Για την αντιμετώπιση του [προβλήματος προεπισκόπησης αντικειμένου](/slides/el/cpp/object-preview-issue-when-adding-oleobjectframe/), αντιστοιχίσαμε την εικόνα του διαγράμματος στο πλαίσιο OLE του διαγράμματος. Στην έξοδο της παρουσίασης, όταν κάνετε διπλό κλικ στο πλαίσιο OLE που εμφανίζει την εικόνα του διαγράμματος, το διάγραμμα Excel ενεργοποιείται. Οι τελικοί χρήστες μπορούν να κάνουν οποιεσδήποτε αλλαγές στο υποκείμενο βιβλίο εργασίας Excel και, στη συνέχεια, να επιστρέψουν στη σχετική διαφάνεια κάνοντας κλικ εκτός του ενεργοποιημένου βιβλίου εργασίας. Το μέγεθος του πλαισίου OLE αλλάζει όταν ο χρήστης επιστρέφει στη διαφάνεια, και ο παράγοντας αλλαγής μεγέθους διαφέρει ανάλογα με τα αρχικά μεγέθη τόσο του πλαισίου OLE όσο και του ενσωματωμένου βιβλίου εργασίας Excel.

## **Αιτία Αλλαγής Μεγέθους**

Δεδομένου ότι το βιβλίο εργασίας Excel διαθέτει το δικό του μέγεθος παραθύρου, προσπαθεί να διατηρήσει το αρχικό του μέγεθος κατά την πρώτη ενεργοποίηση. Το πλαίσιο αντικειμένου OLE, ωστόσο, έχει το δικό του μέγεθος. Σύμφωνα με τη Microsoft, όταν το βιβλίο εργασίας Excel ενεργοποιείται, το Excel και το PowerPoint διαπραγματεύονται το μέγεθος και διατηρούν τις σωστές αναλογίες ως μέρος της διαδικασίας ενσωμάτωσης. Ανάλογα με τις διαφορές μεταξύ του μεγέθους παραθύρου του Excel και του μεγέθους ή της θέσης του πλαισίου OLE, εμφανίζεται αλλαγή μεγέθους.

## **Λύση Λειτουργίας**

Υπάρχουν δύο πιθανές προσεγγίσεις για τη δημιουργία παρουσιάσεων PowerPoint χρησιμοποιώντας το Aspose.Slides for C++.

**Scenario 1:** Δημιουργία παρουσίασης βάσει υπάρχοντος προτύπου.

**Scenario 2:** Δημιουργία παρουσίασης από το μηδέν.

Η λύση που παρέχουμε εδώ ισχύει και για τις δύο προσεγγίσεις. Η βάση όλων των προσεγγίσεων είναι η ίδια: **το παράθυρο του ενσωματωμένου αντικειμένου OLE πρέπει να ταιριάζει με το πλαίσιο OLE στη διαφάνεια PowerPoint**. Θα συζητήσουμε τώρα τις δύο προσεγγίσεις σε αυτή τη λύση.

## **Πρώτη Προσέγγιση**

Σε αυτή την προσέγγιση, θα μάθουμε πώς να ορίσουμε το μέγεθος παραθύρου του ενσωματωμένου βιβλίου εργασίας Excel ώστε να ταιριάζει με το μέγεθος του πλαισίου OLE στη διαφάνεια PowerPoint.

**Scenario 1** 

Υποθέτουμε ότι έχουμε ορίσει ένα πρότυπο και θέλουμε να δημιουργήσουμε παρουσιάσεις βάσει αυτού. Υπάρχει ένα σχήμα στην θέση 2 του προτύπου όπου θέλουμε να τοποθετήσουμε ένα πλαίσιο OLE που περιέχει ένα ενσωματωμένο βιβλίο εργασίας Excel. Σε αυτήν την περίπτωση, το μέγεθος του πλαισίου OLE είναι προπροκαθορισμένο—αντιστοιχεί στο μέγεθος του σχήματος στην θέση 2 του προτύπου. Το μόνο που χρειάζεται να κάνουμε είναι να ορίσουμε το μέγεθος παραθύρου του βιβλίου εργασίας ίσο με το μέγεθος εκείνου του σχήματος. Το παρακάτω απόσπασμα κώδικα εξυπηρετεί αυτόν τον σκοπό:

```cpp
System::SharedPtr<System::IO::MemoryStream> ToSlidesMemoryStream(intrusive_ptr<Aspose::Cells::Systems::IO::MemoryStream> inputStream)
{
    auto outputBuffer = System::MakeArray<uint8_t>(inputStream->GetLength(), inputStream->GetBuffer()->ArrayPoint());
    auto outputStream = System::MakeObject<System::IO::MemoryStream>(outputBuffer);

    return outputStream;
}
```

```cpp
// Ορίστε το μέγεθος του διαγράμματος με παράθυρο. 
chart->SetSizeWithWindow(true);

auto shape = slide->get_Shape(2);

// Ορίστε το πλάτος του παραθύρου του βιβλίου εργασίας σε ίντσες (διαμερισμένο με 72 καθώς το PowerPoint χρησιμοποιεί 72 εικονοστοιχεία ανά ίντσα).
workbook->GetISettings()->SetWindowWidthInch(shape->get_Width() / 72.f);

// Ορίστε το ύψος του παραθύρου του βιβλίου εργασίας σε ίντσες.
workbook->GetISettings()->SetWindowHeightInch(shape->get_Height() / 72.f);

// Αποθηκεύστε το βιβλίο εργασίας σε ροή μνήμης.
System::SharedPtr<System::IO::MemoryStream> workbookStream = ToSlidesMemoryStream3(workbook->SaveToStream());

System::SharedPtr<IOleEmbeddedDataInfo> dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookStream->ToArray(), u"xls");

// Δημιουργήστε ένα πλαίσιο αντικειμένου OLE με τα ενσωματωμένα δεδομένα Excel.
System::SharedPtr<IOleObjectFrame> oleFrame = slide->get_Shapes()->AddOleObjectFrame(
    shape->get_X(), 
    shape->get_Y(), 
    shape->get_Width(), 
    shape->get_Height(),
    dataInfo);
```

**Scenario 2** 

Ας πούμε ότι θέλουμε να δημιουργήσουμε μια παρουσίαση από το μηδέν και να συμπεριλάβουμε ένα πλαίσιο OLE οποιουδήποτε μεγέθους με ενσωματωμένο βιβλίο εργασίας Excel. Στο παρακάτω απόσπασμα κώδικα, δημιουργούμε ένα πλαίσιο OLE ύψους 4 ίντσες και πλάτους 9,5 ίντσες στο x = 0,5 ίντσες και y = 1 ίντσα στη διαφάνεια. Στη συνέχεια ορίζουμε το παράθυρο του βιβλίου εργασίας Excel στο ίδιο μέγεθος—4 ίντσες ύψος και 9,5 ίντσες πλάτος.

```cpp
// Το επιθυμητό ύψος.
int32_t desiredHeight = 288; // 4 ίντσες (4 * 72)

// Το επιθυμητό πλάτος.
int32_t desiredWidth = 684; // 9.5 ίντσες (9.5 * 72)

// Ορίστε το μέγεθος του διαγράμματος με παράθυρο. 
chart->SetSizeWithWindow(true);

// Ορίστε το πλάτος του παραθύρου του βιβλίου εργασίας σε ίντσες.
workbook->GetISettings()->SetWindowWidthInch(desiredWidth / 72.f);

// Ορίστε το ύψος του παραθύρου του βιβλίου εργασίας σε ίντσες.
workbook->GetISettings()->SetWindowHeightInch(desiredHeight / 72.f);

// Αποθηκεύστε το βιβλίο εργασίας σε ροή μνήμης.
System::SharedPtr<System::IO::MemoryStream> workbookStream = ToSlidesMemoryStream(workbook->SaveToStream());

System::SharedPtr<IOleEmbeddedDataInfo> dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookStream->ToArray(), u"xls");

// Δημιουργήστε ένα πλαίσιο αντικειμένου OLE με τα ενσωματωμένα δεδομένα Excel.
System::SharedPtr<IOleObjectFrame> oleFrame = slide->get_Shapes()->AddOleObjectFrame(
    36.0f,
    72.0f, 
    desiredWidth, 
    desiredHeight,
    dataInfo);
```

## **Δεύτερη Προσέγγιση**

Σε αυτή την προσέγγιση, θα μάθουμε πώς να ορίσουμε το μέγεθος του διαγράμματος στο ενσωματωμένο βιβλίο εργασίας Excel ώστε να ταιριάζει με το μέγεθος του πλαισίου OLE στη διαφάνεια PowerPoint. Αυτή η προσέγγιση είναι χρήσιμη όταν το μέγεθος του διαγράμματος είναι γνωστό εκ των προτέρων και δεν θα αλλάξει.

**Scenario 1** 

Υποθέτουμε ότι έχουμε ορίσει ένα πρότυπο και θέλουμε να δημιουργήσουμε παρουσιάσεις βάσει αυτού. Υπάρχει ένα σχήμα στην θέση 2 του προτύπου όπου σκοπεύουμε να τοποθετήσουμε ένα πλαίσιο OLE που περιέχει ένα ενσωματωμένο βιβλίο εργασίας Excel. Σε αυτή την περίπτωση, το μέγεθος του πλαισίου OLE είναι προπροκαθορισμένο—αντιστοιχεί στο μέγεθος του σχήματος στην θέση 2 του προτύπου. Το μόνο που χρειάζεται να κάνουμε είναι να ορίσουμε το μέγεθος του διαγράμματος στο βιβλίο εργασίας ίσο με το μέγεθος του σχήματος. Το παρακάτω απόσπασμα κώδικα εξυπηρετεί αυτόν τον σκοπό:

```cpp
// Ορίστε το μέγεθος του διαγράμματος χωρίς παράθυρο. 
chart->SetSizeWithWindow(false);

auto shape = slide->get_Shape(2);

// Ορίστε το πλάτος του διαγράμματος σε εικονοστοιχεία (πολλαπλασιάστε με 96 καθώς το Excel χρησιμοποιεί 96 εικονοστοιχεία ανά ίντσα).    
chart->GetIChartObject()->SetWidth((int32_t)(shape->get_Width() / 72.f * 96.f));

// Ορίστε το ύψος του διαγράμματος σε εικονοστοιχεία.
chart->GetIChartObject()->SetHeight((int32_t)(shape->get_Height() / 72.f) * 96.f);

// Ορίστε το μέγεθος εκτύπωσης του διαγράμματος.
chart->SetPrintSize(Aspose::Cells::PrintSizeType::PrintSizeType_Custom);

// Αποθηκεύστε το βιβλίο εργασίας σε ροή μνήμης.
System::SharedPtr<System::IO::MemoryStream> workbookStream = ToSlidesMemoryStream(workbook->SaveToStream());

System::SharedPtr<IOleEmbeddedDataInfo> dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookStream->ToArray(), u"xls");

// Δημιουργήστε ένα πλαίσιο αντικειμένου OLE με τα ενσωματωμένα δεδομένα Excel.
System::SharedPtr<IOleObjectFrame> oleFrame = slide->get_Shapes()->AddOleObjectFrame(
    shape->get_X(), 
    shape->get_Y(), 
    shape->get_Width(),
    shape->get_Height(),
    dataInfo);
```

**Scenario 2** 

Υποθέτουμε ότι θέλουμε να δημιουργήσουμε μια παρουσίαση από το μηδέν και να συμπεριλάβουμε ένα πλαίσιο OLE οποιουδήποτε μεγέθους με ενσωματωμένο βιβλίο εργασίας Excel. Στο παρακάτω απόσπασμα κώδικα, δημιουργούμε ένα πλαίσιο OLE ύψους 4 ίντσες και πλάτους 9,5 ίντσες στη διαφάνεια στο x = 0,5 ίντσες και y = 1 ίντσα. Ορίζουμε επίσης το αντίστοιχο μέγεθος διαγράμματος στις ίδιες διαστάσεις: ύψος 4 ίντσες και πλάτος 9,5 ίντσες.

```cpp
// Το επιθυμητό ύψος.
int32_t desiredHeight = 288; // 4 ίντσες (4 * 576)

// Το επιθυμητό πλάτος.
int32_t desiredWidth = 684; // 9.5 ίντσες(9.5 * 576)

// Ορίστε το μέγεθος του διαγράμματος χωρίς παράθυρο. 
chart->SetSizeWithWindow(false);

// Ορίστε το πλάτος του διαγράμματος σε εικονοστοιχεία.    
chart->GetIChartObject()->SetWidth((int32_t)((desiredWidth / 72.f) * 96.f));

// Ορίστε το ύψος του διαγράμματος σε εικονοστοιχεία.
chart->GetIChartObject()->SetHeight((int32_t)((desiredHeight / 72.f) * 96.f));

// Αποθηκεύστε το βιβλίο εργασίας σε ροή μνήμης.
System::SharedPtr<System::IO::MemoryStream> workbookStream = ToSlidesMemoryStream(workbook->SaveToStream());

System::SharedPtr<IOleEmbeddedDataInfo> dataInfo = System::MakeObject<OleEmbeddedDataInfo>(workbookStream->ToArray(), u"xls");

// Δημιουργήστε ένα πλαίσιο αντικειμένου OLE με τα ενσωματωμένα δεδομένα Excel.
System::SharedPtr<IOleObjectFrame> oleFrame = slide->get_Shapes()->AddOleObjectFrame(
    36.0f, 
    72.0f, 
    desiredWidth, 
    desiredHeight,
    dataInfo);
```

## **Συμπέρασμα**

Υπάρχουν δύο προσεγγίσεις για την επίλυση του προβλήματος αλλαγής μεγέθους του διαγράμματος. Η επιλογή προσέγγισης εξαρτάται από τις απαιτήσεις και την περίπτωση χρήσης. Και οι δύο προσεγγίσεις λειτουργούν με τον ίδιο τρόπο, είτε οι παρουσιάσεις δημιουργούνται από πρότυπο είτε από το μηδέν. Επίσης, δεν υπάρχει όριο στο μέγεθος του πλαισίου OLE σε αυτή τη λύση.

## **Συχνές Ερωτήσεις**

**Γιατί το ενσωματωμένο διάγραμμα Excel αλλάζει μέγεθος μετά την ενεργοποίηση στο PowerPoint;**

Αυτό συμβαίνει επειδή το Excel προσπαθεί να επαναφέρει το αρχικό μέγεθος του παραθύρου κατά την πρώτη ενεργοποίηση, ενώ το πλαίσιο OLE στο PowerPoint έχει τις δικές του διαστάσεις. Το PowerPoint και το Excel διαπραγματεύονται το μέγεθος για να διατηρήσουν την αναλογία διαστάσεων, κάτι που μπορεί να προκαλέσει την αλλαγή μεγέθους.

**Μπορεί κανείς να αποτρέψει πλήρως αυτό το πρόβλημα αλλαγής μεγέθους;**

Ναι. Αν ταιριάξετε το μέγεθος του παραθύρου του βιβλίου εργασίας Excel ή το μέγεθος του διαγράμματος με το μέγεθος του πλαισίου OLE πριν την ενσωμάτωση, μπορείτε να διατηρήσετε σταθερά τα μεγέθη των διαγραμμάτων.

**Ποια προσέγγιση πρέπει να επιλέξω, να ορίσω το μέγεθος του παραθύρου του βιβλίου εργασίας ή το μέγεθος του διαγράμματος;**

Χρησιμοποιήστε **Approach 1 (window size)** αν θέλετε να διατηρήσετε την αναλογία του βιβλίου εργασίας και ενδεχομένως να επιτρέψετε μελλοντική αλλαγή μεγέθους.  
Χρησιμοποιήστε **Approach 2 (chart size)** αν οι διαστάσεις του διαγράμματος είναι σταθερές και δεν θα αλλάξουν μετά την ενσωμάτωση.

**Θα λειτουργήσουν αυτές οι μέθοδοι και για παρουσιάσεις βάσει προτύπου και για νέες παρουσιάσεις;**

Ναι. Και οι δύο προσεγγίσεις λειτουργούν με τον ίδιο τρόπο για παρουσιάσεις που δημιουργούνται από πρότυπα και από το μηδέν.

**Υπάρχει όριο στο μέγεθος του πλαισίου OLE;**

Όχι. Μπορείτε να ορίσετε το πλαίσιο OLE σε οποιοδήποτε μέγεθος, αρκεί να κλιμακωθεί ανάλογα με το μέγεθος του βιβλίου εργασίας ή του διαγράμματος.

**Μπορώ να χρησιμοποιήσω αυτές τις μεθόδους με διαγράμματα που δημιουργήθηκαν σε άλλα προγράμματα λογιστικών φύλλων;**

Τα παραδείγματα είναι σχεδιασμένα για διαγράμματα Excel που δημιουργήθηκαν με το Aspose.Cells, αλλά οι αρχές ισχύουν και για άλλα προγράμματα λογιστικών φύλλων συμβατά με OLE, εφόσον υποστηρίζουν παρόμοιες επιλογές μεγέθους.

## **Σχετικές Ενότητες**

- [Δημιουργία Διαγραμμάτων Excel και Ενσωμάτωση τους ως Αντικείμενα OLE σε Παρουσιάσεις](/slides/el/cpp/creating-excel-chart-and-embedding-it-in-presentation-as-ole-object/)
