Funktionierende Lösung für das Ändern der Größe von Diagrammen in PPTX

Hintergrund

Im vorherigen Artikel haben wir erklärt, wie man ein Excel-Diagramm mit Aspose.Cells für C++ erstellt und dieses Diagramm dann mit Aspose.Slides für C++ in eine PowerPoint-Präsentation einbettet. Um das Problem der Objektänderung zu berücksichtigen, haben wir das Diagrammbild auf den OLE-Objektrahmen des Diagramms zugewiesen. In der Ausgabpräsentation wird das Excel-Diagramm aktiviert, wenn wir den OLE-Objektrahmen, der das Diagrammbild anzeigt, doppelklicken. Die Endbenutzer können die gewünschten Änderungen in der tatsächlichen Excel-Arbeitsmappe vornehmen und dann zur betreffenden Folie zurückkehren, indem sie außerhalb der aktivierten Excel-Arbeitsmappe klicken. Die Größe des OLE-Objektrahmens ändert sich, wenn der Benutzer zur Folie zurückkehrt. Der Größenänderungsfaktor wird für verschiedene Größen des OLE-Objektrahmens und der eingebetteten Excel-Arbeitsmappe unterschiedlich sein.

Ursache der Größenänderung

Da die Excel-Arbeitsmappe ihre eigene Fenstergröße hat, versucht sie, ihre ursprüngliche Größe bei der ersten Aktivierung beizubehalten. Andererseits hat der OLE-Objektrahmen seine eigene Größe. Laut Microsoft verhandeln Excel und PowerPoint bei der Aktivierung der Excel-Arbeitsmappe die Größe und stellen sicher, dass sie im richtigen Verhältnis als Teil des Einbettungsprozesses vorliegt. Basierend auf den Unterschieden in der Fenstergröße von Excel und der Größe / Position des OLE-Objektrahmens findet die Größenänderung statt.

Funktionierende Lösung

Es gibt zwei mögliche Szenarien für die Erstellung von PowerPoint-Präsentationen mit Aspose.Slides für C++.

Szenario 1: Erstellen der Präsentation auf Basis einer vorhandenen Vorlage.

Szenario 2: Erstellen der Präsentation von Grund auf.

Die Lösung, die wir hier bereitstellen werden, ist für beide Szenarien gültig. Die Grundlage aller Lösungsansätze wird gleich sein. Das heißt: Die Fenstergröße des eingebetteten OLE-Objekts sollte der des OLE-Objektrahmens in der PowerPoint-Folie entsprechen. Jetzt werden wir die beiden Ansätze der Lösung diskutieren.

Erster Ansatz

In diesem Ansatz lernen wir, wie man die Fenstergröße der eingebetteten Excel-Arbeitsmappe entsprechend der Größe des OLE-Objektrahmens in der PowerPoint-Folie einstellt.

Szenario 1

Angenommen, wir haben eine Vorlage definiert und möchten die Präsentationen auf dieser Vorlage basieren. Angenommen, es gibt eine Form an Index 2 in der Vorlage, wo wir einen OLE-Rahmen mit einer eingebetteten Excel-Arbeitsmappe platzieren möchten. In diesem Szenario wird die Größe des OLE-Objektrahmens als vordefiniert betrachtet (was der Größe der Form an Index 2 in der Vorlage entspricht). Alles, was wir tun müssen: Setzen Sie die Fenstergröße der Arbeitsmappe gleich der Größe der Form. Der folgende Code-Ausschnitt dient diesem Zweck:

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;
}
// Diagrammgröße mit Fenster definieren 
chart->SetSizeWithWindow(true);

auto shape = slide->get_Shapes()->idx_get(2);

// Fensterbreite der Arbeitsmappe in Zoll setzen (geteilt durch 72, da PowerPoint 
// 72 Pixel / Zoll verwendet)
wb->GetISettings()->SetWindowWidthInch(shape->get_Width() / 72.f);

// Fensterhöhe der Arbeitsmappe in Zoll setzen
wb->GetISettings()->SetWindowHeightInch(shape->get_Height() / 72.f);

// Instanz von MemoryStream
System::SharedPtr<System::IO::MemoryStream> ms = ToSlidesMemoryStream3(wb->SaveToStream());

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

// Erstellen eines OLE-Objektrahmens mit eingebettetem Excel
System::SharedPtr<IOleObjectFrame> objFrame = slide->get_Shapes()->AddOleObjectFrame(
	shape->get_X(), 
	shape->get_Y(), 
	shape->get_Width(), 
	shape->get_Height(),
	dataInfo);

Szenario 2

Angenommen, wir möchten eine Präsentation von Grund auf neu erstellen und wünschen uns einen OLE-Objektrahmen beliebiger Größe mit einer eingebetteten Excel-Arbeitsmappe. Im folgenden Code-Ausschnitt haben wir einen OLE-Objektrahmen mit einer Höhe von 4 Zoll und einer Breite von 9,5 Zoll in der Folie an der x-Achse=0,5 Zoll und an der y-Achse=1 Zoll erstellt. Darüber hinaus haben wir die entsprechende Fenstergröße der Excel-Arbeitsmappe eingestellt, das heißt: Höhe 4 Zoll und Breite 9,5 Zoll.

// Unsere gewünschte Höhe
int32_t desiredHeight = 288; // 4 Zoll (4 * 72)

// Unsere gewünschte Breite
int32_t desiredWidth = 684; // 9,5 Zoll (9,5 * 72)

// Diagrammgröße mit Fenster definieren 
chart->SetSizeWithWindow(true);

// Fensterbreite der Arbeitsmappe in Zoll setzen
wb->GetISettings()->SetWindowWidthInch(desiredWidth / 72.f);

// Fensterhöhe der Arbeitsmappe in Zoll setzen
wb->GetISettings()->SetWindowHeightInch(desiredHeight / 72.f);

// Instanz von MemoryStream
System::SharedPtr<System::IO::MemoryStream> ms = ToSlidesMemoryStream(wb->SaveToStream());

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

// Erstellen eines OLE-Objektrahmens mit eingebettetem Excel
System::SharedPtr<IOleObjectFrame> objFrame = slide->get_Shapes()->AddOleObjectFrame(
	36.0f,
	72.0f, 
	desiredWidth, 
	desiredHeight,
	dataInfo);

Zweiter Ansatz

In diesem Ansatz lernen wir, wie man die Diagrammgröße in der eingebetteten Excel-Arbeitsmappe entsprechend der Größe des OLE-Objektrahmens in der PowerPoint-Folie einstellt. Dieser Ansatz ist nützlich, wenn die Größe des Diagramms im Voraus bekannt ist und sich niemals ändern wird.

Szenario 1

Angenommen, wir haben eine Vorlage definiert und möchten die Präsentationen auf dieser Vorlage basieren. Angenommen, es gibt eine Form an Index 2 in der Vorlage, wo wir einen OLE-Rahmen mit einer eingebetteten Excel-Arbeitsmappe platzieren möchten. In diesem Szenario wird die Größe des OLE-Rahmens als vordefiniert betrachtet (was der Größe der Form an Index 2 in der Vorlage entspricht). Alles, was wir tun müssen: Stellen Sie die Größe des Diagramms in der Arbeitsmappe gleich der Größe der Form ein. Der folgende Code-Ausschnitt dient diesem Zweck:

// Diagrammgröße ohne Fenster definieren 
chart->SetSizeWithWindow(false);

auto shape = slide->get_Shapes()->idx_get(2);

// Diagrammbreite in Pixeln setzen (mit 96 multiplizieren, da Excel 96 Pixel pro Zoll verwendet)    
chart->GetIChartObject()->SetWidth((int32_t)(shape->get_Width() / 72.f * 96.f));

// Diagrammhöhe in Pixeln setzen
chart->GetIChartObject()->SetHeight((int32_t)(shape->get_Height() / 72.f) * 96.f);

// Diagramm-Druckgröße definieren
chart->SetPrintSize(Aspose::Cells::PrintSizeType::PrintSizeType_Custom);

// Instanz von MemoryStream
System::SharedPtr<System::IO::MemoryStream> ms = ToSlidesMemoryStream(wb->SaveToStream());

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

// Erstellen eines OLE-Objektrahmens mit eingebettetem Excel
System::SharedPtr<IOleObjectFrame> objFrame = slide->get_Shapes()->AddOleObjectFrame(
	shape->get_X(), 
	shape->get_Y(), 
	shape->get_Width(),
	shape->get_Height(),
	dataInfo);

Szenario 2

Angenommen, wir möchten eine Präsentation von Grund auf neu erstellen und wünschen uns einen OLE-Objektrahmen beliebiger Größe mit einer eingebetteten Excel-Arbeitsmappe. Im folgenden Code-Ausschnitt haben wir einen OLE-Objektrahmen mit einer Höhe von 4 Zoll und einer Breite von 9,5 Zoll in der Folie an der x-Achse=0,5 Zoll und an der y-Achse=1 Zoll erstellt. Darüber hinaus haben wir die entsprechende Diagrammgröße eingestellt, das heißt: Höhe 4 Zoll und Breite 9,5 Zoll.

// Unsere gewünschte Höhe
int32_t desiredHeight = 288; // 4 Zoll (4 * 576)

// Unsere gewünschte Breite
int32_t desiredWidth = 684; // 9,5 Zoll(9,5 * 576)

// Diagrammgröße ohne Fenster definieren 
chart->SetSizeWithWindow(false);

// Diagrammbreite in Pixeln setzen    
chart->GetIChartObject()->SetWidth((int32_t)((desiredWidth / 72.f) * 96.f));

// Diagrammhöhe in Pixeln setzen    
chart->GetIChartObject()->SetHeight((int32_t)((desiredHeight / 72.f) * 96.f));

// Instanz von MemoryStream
System::SharedPtr<System::IO::MemoryStream> ms = ToSlidesMemoryStream(wb->SaveToStream());

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

// Erstellen eines OLE-Objektrahmens mit eingebettetem Excel
System::SharedPtr<IOleObjectFrame> objFrame = slide->get_Shapes()->AddOleObjectFrame(
	36.0f, 
	72.0f, 
	desiredWidth, 
	desiredHeight,
	dataInfo);

Fazit

Verwandte Abschnitte

Erstellen und Einbetten eines Excel-Diagramms als OLE-Objekt in einer Präsentation