2008-10-22 4 views
5

Ich baue eine "Import von Excel" -Funktion. Es muss in einer DLL sein, die von einer Nicht-MFC-App aufgerufen wird. Es muss ein Bild der Tabelle bereitgestellt werden, in das Benutzer eine Auswahlbox ziehen können (um Zellen auszuwählen), dann auf eine Schaltfläche IMPORT klicken und das Richtige passieren lassen. Probleme beim Abrufen der Tabelle, beim Anfügen einer Schaltfläche und beim Ausführen in einer DLL.Benötigen ActiveX-Steuerelement zum Einbetten von Excel in einen Dialog

Ich ging die Route eines MFC-Dialogfelds in einer DLL, wurde jedoch beim Versuch blockiert, einen OLE-Client für Excel in einem Fenster des Dialogfelds anzuzeigen. Nur die Unterstützung, die ich für das Anzeigen von Excel mithilfe von OLE fand, erforderte eine SDI. Ich war in der Lage, die Automatisierungsfunktionen zum Laufen zu bringen, und ich konnte die Zellen lesen und ein "falsches Bild" von ihnen auf meinem Dialog malen ... aber ich befürchte, dass meine Anforderungen nicht erfüllt werden.

Also habe ich versucht, eine SDI zu erstellen. Ich war in der Lage, ein SDI zu erstellen, das Excel als OLE-Client hervorbrachte. Ich war in der Lage, das Ereignis "Auswahländerung" zu verarbeiten und die benötigten Zellendaten zu übernehmen. Ich wurde an diesem Punkt durch 2 Punkte vereitelt:

  1. Konnte nicht diese SDI in einer MFC-DLL funktionieren. Absturz im CWinApp-Konstruktor, der angibt, dass AfxGetThread nicht null ist. Die "theApp" wurde so verschoben, dass sie innerhalb der einzelnen exportierten DLL-Funktion lokal beschränkt ist, aber sie konnte trotzdem nicht funktionieren, aber mit anderen Symptomen: abgestürzt, wenn AFX_MANAGE_STATE hinzugefügt wurde (AfxGetStaticModuleState()); zu exportierten DLL-Funktion, wenn ich das nicht verwendete, wurde die OnInitInstance nie eingegeben. Versucht, einen Anruf zur Funktion Run() der App hinzuzufügen, aber das hat nicht geholfen. Ich kann diesen Code posten, wenn jemand denkt, dass er eine Idee hat, was das Problem ist.

  2. Es konnte keine Symbolleiste angezeigt werden, während das Excel-Clientelement aktiv war. Ich könnte meinen "Import" (und andere Optionen) oben auf die Menüleiste setzen, aber das ist nicht offensichtlich genug. Selbst eine schwebende Werkzeugleiste wurde geschlossen. Es macht Sinn, dass es dies tun würde, da es verwirrend wäre, wenn eine Symbolleiste vorhanden wäre, die keine Aktionen für das gerade aktive Element ausführen könnte ... aber in meinem Fall ist das ein Problem.

So, jetzt ich denke ich zurück an den Dialogansatz gehen müssen, und betten Sie ein ActiveX-Steuerelement, das eine Excel-Tabelle-Datei zu importieren bringt.

Muss entweder erlauben, das Selektionsänderungsereignis zu behandeln, oder muss mir erlauben, welche Zellen ausgewählt (oder wurden zuletzt ausgewählt, wenn das Klicken auf die Schaltfläche "Importieren" in meinem Dialogfeld die ausgewählten Zellen deaktiviert).

Es muss auch mit angemessenen Lizenzbedingungen kommen, wie dies in einer kommerziellen Anwendung verwendet werden wird, die für die Öffentlichkeit breit verfügbar ist.

Wenn jemand eine "schnelle Lösung" zu einem der Ansätze weiß, die ich versucht habe, wäre das auch nützlich.

Hoffe jemand kann mir helfen!

Antwort

0

Wenn Sie nur Excel einbetten möchten, brauchen Sie nichts.

Einfach in ein Standard-OCX-Host-Steuerelement einbetten.

+0

Hallo Fred. Ich bin mit dieser Kontrolle nicht vertraut. Google zeigt eine Reihe von App-Referenzen von Drittanbietern an. Wenn Sie in VS mit der rechten Maustaste auf mein Dialogfeld klicken und dann "ActiveX-Steuerelement einfügen ..." auswählen, hat das nichts mehr mit dem OCX-Host-Steuerelement zu tun. Kannst du mich in die richtige Richtung weisen? Vielen Dank!! – Steve

+0

Whoops !! Entschuldigen Sie! Entschuldigung, Mikea! Ich weiß nicht wo ich den Namen "Fred" herbekommen habe. Zu viel Multitasking. – Steve

+0

Ich habe das Microsoft DSOFramer-Steuerelement gefunden, ein OCX-Beispiel, das mit Schnittstellen zu Office-Apps bereitgestellt wird. Ich bin mir nicht sicher, ob Sie das vorschlagen, aber das hat mich dahin gebracht, wo ich sein musste. Danke noch einmal! – Steve

Verwandte Themen