Python: Greifen Sie auf eingebettetes OLE aus einem Office / Excel-Dokument ohne Zwischenablage zu

8

Ich möchte mit Python Dateien aus einem Office / Excel-Dokument hinzufügen und extrahieren. Bisher ist das Hinzufügen von Dingen einfach, aber zum Extrahieren habe ich keine saubere Lösung gefunden.

Um klar zu machen, was ich habe und was nicht, habe ich das kleine Beispiel test.py geschrieben und weiter erklärt.

test.py

%Vor%

Für die Vorbereitung (Schritt 0) öffnet es ein Excel-Dokument mit einem Arbeitsblatt, das zuvor erstellt wurde, indem Sie in Excel die Schaltfläche neues Dokument verwenden. In Schritt (1) verwendet es eine API zum Einbetten einer bestimmten Textdatei in das Excel-Dokument. Die Textdatei wurde zuvor mit dem Inhalt "TEST123" mit einem Texteditor erstellt. Anschließend versucht es in Schritt (2) Inhalt von eingebettetem OLE mithilfe der Zwischenablage zurück zu lesen und öffnet ein Meldungsfeld, das den Inhalt von OLE in der Zwischenablage anzeigt. Schließlich (3) schließt das Programm das geöffnete Dokument. Um eine unveränderte Konfiguration beizubehalten, drücken Sie no hier.

Der große Nachteil dieser Lösung ist die Verwendung der Zwischenablage, die jeden Benutzerinhalt in die Zwischenablage schneidet, was ein schlechter Stil in einer produktiven Umgebung ist. Außerdem wird eine undokumentierte Option für die Zwischenablage verwendet.

Eine bessere Lösung wäre es, OLE- oder OLE-Dateien in einem Python-Datencontainer oder in einer Datei meiner Wahl zu speichern. In meinem Beispiel habe ich eine TXT-Datei verwendet, um Dateidaten einfach zu identifizieren. Schließlich verwende ich ZIP für eine All-in-One-Lösung, aber eine TXT-Datei-Lösung wäre ausreichend für Base64-Daten.

Quelle von 0xC004 = 49156: Ссылка

Dieses VBA-Beispiel sieht interessant aus, aber ich habe keine Ahnung von VBA: Eingebettetes OLE-Objekt (Excel-Dokument) als Datei in Excel 2010 im Vergleich zu 2013 speichern

    
BREMI 01.04.2017, 08:14
quelle

2 Antworten

3

Nun, ich finde Parfaits Lösung ein wenig hackisch (im schlechten Sinne), weil

  • es geht davon aus, dass Excel die Einbettung als temporäre Datei speichert,
  • es nimmt an, dass der Pfad dieser temporären Datei immer der Standardtemp-Pfad des Benutzers ist,
  • Es wird davon ausgegangen, dass Sie dort Berechtigungen zum Öffnen von Dateien haben,
  • es wird davon ausgegangen, dass Sie eine Benennungskonvention verwenden, um Ihre Objekte zu identifizieren (z. B. "test_txt" wird immer im Namen gefunden, Sie können nicht fügen Sie ein Objekt 'account_data' ein,
  • es geht davon aus, dass diese Konvention nicht vom Betriebssystem gestört wird (z. B. wird es nicht in '~ test_tx (1)' geändert, um Zeichen zu sparen Länge),
  • es geht davon aus, dass diese Konvention bekannt ist und von allen anderen Programmen auf dem Computer akzeptiert wird (niemand wird Namen verwenden, die 'test_txt' enthalten).

Also habe ich eine alternative Lösung geschrieben. Das Wesentliche davon ist das Folgende:

  1. Entpacken Sie die .xlsx-Datei (oder jede andere Office-Datei in der neuen XML-basierten (nicht passwortgeschützt) auf einen temporären Pfad.

  2. durchläuft alle .bin-Dateien innerhalb der '/ xxx / embeddings' ('xxx' =     'xl' oder 'word' oder 'ppt') und erstellen Sie ein Wörterbuch, das die .bin enthält     temporäre Pfade der Dateien als Schlüssel und die Wörterbücher von     Schritt 3 als Werte.

  3. extrahiert Informationen aus der .bin-Datei gemäß dem (nicht sehr     gut dokumentiert) Ole Packager Format, und geben Sie die Informationen als zurück     ein Wörterbuch. (Ruft die rohen Binärdaten als 'Inhalt' ab, nicht nur     von .txt, aber irgendein Dateityp, z.B. .png)

Ich lerne immer noch Python, also ist das nicht perfekt (keine Fehlerüberprüfung, keine Leistungsoptimierung), aber Sie können die Idee davon bekommen. Ich habe es an einigen Beispielen getestet. Hier ist mein Code:

%Vor%

Sie können es wie folgt verwenden:

%Vor%     
z32a7ul 14.04.2017 10:19
quelle
1

Erwägen Sie, das temporäre Windows-Verzeichnis zu verwenden, das die Dateiquelle des Ole-Objekts vorübergehend bei dem Einbetten in Arbeitsmappe speichert. In dieser Lösung wird keine Zwischenablage verwendet, sondern physische Dateien.

Bei diesem Ansatz müssen Sie den Namen des aktuellen Benutzers abrufen und alle Dateien des temporären Verzeichnisses durchlaufen: C: \ Dokumente und Einstellungen \ {Benutzername} \ Lokale Einstellungen \ Temp (Standard) Excel-Dump-Ordner für Windows Vista / 7/8/10). Außerdem wird eine bedingte Suchnamen-Suche mit in verwendet, die den Basisnamen der Originaldatei enthält, da mehrere Versionen mit Suffixen (1), (2), (3) usw. existieren können, abhängig davon, wie oft das Skript ausgeführt wird. Versuchen Sie sogar eine Regex-Suche hier.

Schließlich verwendet die folgende Routine try...except...finally block, um die Excel-Objekte unabhängig vom Fehler sauber zu erhalten, gibt aber eine beliebige Ausnahme aus. Beachten Sie, dass dies nur eine Windows-Lösung ist, die eine Textdatei verwendet.

%Vor%

Tkinter-Messagebox

    
Parfait 08.04.2017 15:05
quelle

Tags und Links