Werte aus Excel per DOI (unsichtbar)
Desktop-Office-Integration – kurz DOI – ermöglicht das Bearbeiten von Office-Dokumenten innerhalb einer SAP-Anwendung. Auf Wunsch kann dies auch inplace passieren. Mit den von SAP zur Verfügung gestellten Klassen lassen sich die gängigsten Arbeiten erledigen. Allerdings erfordern diese auch immer eine Anzeige des Office-Dokumentes.
Ich möchte euch einen Trick vorstellen, bei dem zwar DOI verwendet wird, ihr aber nichts davon mitbekommt…
Bereichsleiter
Ich stelle euch unten ein Programm vor, das eine Excel-Datei einliest und die Daten abgreift. Der Zugriff erfolgt dabei über Bereiche. In meinem Beispiel-Excel habe ich ein paar Bereich benannt:
Gibt es in dem Excel keine Bereiche, so muss ein Bereich definiert werden.
Die Daten werden in einer Tabelle geliefert mit den Feldern:
- ROW
- COLUMN
- VALUE
Mit einem Zugriff können mehrere Bereiche angefordert werden. In der Bereichstabelle wird zwar übermittelt, wie viele Zeilen und Spalten je Bereich enthalten waren. Leider gibt es in der Wertetabelle keinen Bezug mehr zu den Bereichen.
Hier die Rückgabe der Bereiche:
Und hier die Werte dazu:
Wenn du sicher gehen möchtest, welcher Bereich mit welchen Werten gefüllt ist, dann solltest du je Bereich eine Abfrage machen.
[notice type=’alert’]Achtung! DOI kann nur maximal 9999 Spalten und Zeilen verwalten! Das liegt an der internen Verwendung von CHAR4-Typen für die Speicherung der Zeilen und Spalten.
Wenn du also mehr benötigst, musst du mit mehreren Bereichen arbeiten. [/notice]
Ablauf
Die Desktop-Office-Integration wird über Interfaces abgebildet. Alles beginnt jedoch mit einem konkreten Erbauer:
c_oi_container_control_creator=>get_container_control
Dieser erzeugt ein Container-Control für das Dokument. Das Control muss an einen Container gebunden werden. Das geschieht bei der Initialisierung:
lr_control->init_control( ... ).
Danach kann man sich das Dokument über eine allgemeine Dokumentenschnittstelle holen. Alle Funktionen, die hier angeboten sind, gelten für Excel- als auch für Word-Dokumente:
lr_control->get_document_proxy( ... ).
Um direkt auf Excel-Funktionen zugreifen zu können, müssen wir uns das konkrete Dokument-Objekt holen:
lr_document->get_spreadsheet_interface( IMPORTING sheet_interface = lr_spreadsheet ).
Mit dieser Klasse haben wir nun endlich Excel-spezifische Funktionen, wie zum Beispiel der Zugriff auf die Tabellenzellen:
lr_spreadsheet->get_ranges_data( ... ).
Anzeige unterdrücken
Es gibt bei diesem Verfahren meines Wissens keine Möglichkeit, die Nutzung unsichtbar für den Benutzer ablaufen zu lassen. Mit einem Trick gelingt es dennoch…
Das Dynpro, das in Listen Verwendet wird, ist normalerweise das Dynpro CL_GUI_CONTAINER=>SCREEN0. Wenn du also etwas in diesen Container einhängst, dann wird er Bildschirmfüllend angezeigt: Beitrag SCREEN0.
Für verschiedene Anwendungsfälle gibt es jedoch weitere SCREENS. Ich glaube, mit jedem Popup-Level wird der SCREEN hochgezählt. Das können wir uns zu nutze machen, in dem wir das DOI-Control einfach an einen Screen hängen, der nicht angezeigt wird: CL_GUI_CONTAINER=>SCREEN9
CALL METHOD lr_control->init_control EXPORTING inplace_enabled = 'X' no_flush = 'X' r3_application_name = 'Test DOI' parent = cl_gui_container=>screen9 IMPORTING error = error EXCEPTIONS OTHERS = 1.
Wir können also trotzdem eine WRITE-Ausgabe machen. Die Ausgabe erfolgt also quasi parallel.
Den kompletten Quelltext findest du hier.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024
I was not aware of these new interface classes, having used mostly OLE and then ABAP2XLSX for my work. Do you know when these became available? Do they have better performance than the old OLE interaction or do they also use OLE internally?
Using OLE it is quite easy to hide the Office interaction using :
DATA: o_WORD TYPE ole2_object.
*– Create instance of word in background
CREATE OBJECT o_WORD ‘word.application’.
*– Don’t ask to overwrite existing file
set property of o_WORD ‘DisplayAlerts’ = 0.
*– Run in background = 0 (this is default so set is not needed)
* SET PROPERTY OF o_WORD ‘visible’ = 1. “Run in foreground for testing only
etc.
Vielen Dank für Alles auf Trick Tresor!
Olivier
Hi Olivier,
The DOI interface is quite old.
I cannot say anything about performance.
The Idea behind DOI was, to integrate different software – other than Microsoft – using one interface.
Yes, running Word/ Excel invisible is easier with OLE.
Regards
Enno