[Gelöst] QAxWidget und MS Excel 2010 (mögl. Lsg gefunden)

Alles rund um die Programmierung mit Qt
Antworten
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

[Gelöst] QAxWidget und MS Excel 2010 (mögl. Lsg gefunden)

Beitrag von nebler »

Guten Morgen zusammen,

ich versuche mit Hilfe des QAxWidget die Applikation MS Excel 2010 einzubinden.
Allerdings mit mäßigem Erfolg und unterschiedliche Verhaltensweisen.
Ich nutze die Qt Version 4.8.0.

1) Variante 1:

Code: Alles auswählen

QAxWidget* excel = new QAxWidget( "Excel.Application", parent );
excel->dynamicCall( "SetVisible(bool)", true );
Dies führt bei mir dazu, dass mein Widget leer bleibt und die Excel-Applikation in einem seperatren Fenster sichtbar wird.
Meine Erwartung wäre gewesen, dass das QAxWidget an dieser Stelle die Excel-Applikation kapselt.

2) Variante 2:

Code: Alles auswählen

QAxWidget* excel = new QAxWidget( "Test.xlsx", parent );
Aus welchem Grund auch immer, wenn ich eine Datei direkt lade, kapselt das QAxWidget Excel,
allerdings stimmt das Rendering nicht. Die Scrollbars/Ränder der eingebetten Excel-Applikation sind nur teilweise sichtbar.
Dies ist dann auch noch abhängig davon, wie ich das QAxWidget skaliere ...

3) Variante 3:

Code: Alles auswählen

QAxWidget* excel = new QAxWidget( "Excel.Sheet", parent );
So wird die Excel-Applikation super und einwandfrei (wie erwartet) im QAxWidget dargestellt.
Nur ein Haken gibt es hierbei, als COM Objekt habe ich dann das Sheet und auf das Sheet kann ich kein laden einer Datei anstoßen.
Dafür bräuchte ich, soweit wie ich das sehe, die Workbooks.

--
Ich möchte die Excel Applikation einbetten und eine bestehende Datei laden können und eben darin darstellen.
Folgender Code macht dies auch schon, allerdings eben in der Excel-Instanz die ausserhalb meiner Applikation gestartet wird:

Code: Alles auswählen

QAxWidget* excel = new QAxWidget( "Excel.Application", parent );

  layout->addWidget( excel );
  excel->dynamicCall( "SetVisible(bool)", true );
  
  QAxObject* workbooks = excel->querySubObject( "Workbooks()" );

  QAxObject* workbook = workbooks->querySubObject( "Open( QString )", "Test.xlsx" );
Als eine weitere Idee war, da die Variante 3 zu funktionieren scheint, über das Sheet Objekt an das Application Objekt ran zu kommen, und dann die exakt gleichen Aufrufe wie im Code-Abschnitt (direkt über diesen Text) zu machen. Allerdings bekomme ich dann die Fehlermeldung, dass der Open-Command nicht gültig sei. (Hier war die Hoffnung, dass dann beim Open, das aktive/geöffnete dargestellt wird).

Habt ihr zufällig eine Idee?
Ich habe über google nichts passendes gefunden.

EDIT:
Ich habe gerade festgestellt, dass bei einer integrierten Variante, Excel nicht mehr parallel gestartet werden kann (um es "normal" zu verwenden).
Irgendwie ist das Ganze nicht wirklich glücklich ... :shock:

EDIT2:
Wird der Code von http://excelviewer.codeplex.com/SourceC ... lViewer.cs nach C++ gewandelt funktioniert es. Das Rendering stimmt nicht 100%ig, allerdings ist MS Excel innerhalb des QWidgets. Hier wird, soweit ich das sehe, Qt komplett ausgehebelt und das hart in das OS-Windows Objekt (was ein QWidget ja hat) reingeschrieben. Es ist eine Lösung, aber nicht die Lösung die ich mir mit der Benutzung des Qt-Frameworks erhofft habe.

Vielen herzlichen Dank.

Viele Grüße
Dateianhänge
Screenshot zu Variante 3
Screenshot zu Variante 3
Variante3.JPG (39.56 KiB) 2733 mal betrachtet
Screenshot zu Variante 2
Screenshot zu Variante 2
Variante2.JPG (67.23 KiB) 2733 mal betrachtet
Screenshot zu Variante 1
Screenshot zu Variante 1
Variante1.JPG (79.88 KiB) 2733 mal betrachtet
Antworten