Aufgabenstellung:
- Extrahieren von eingebetteten Bildern in separate Bild Dateien
- Einfügen einer Spalte mit den Bilddateinamen und Pfaden
Als Vorbereitung zum Import von Artikeln in eine WooCommerce WordPress Installation soll eine Artikelliste im Excel Format vorbereitet werden. Der Import soll ebenfalls Produktbilder beinhalten. Schwierigkeit ist in diesem Fall, dass der Import über eine CSV Datei stattfinden muss, welcher die Bilder nicht enthalten kann, sondern vielmehr einen Verweis zum Artikelfoto beinhalten soll. So soll die CSV Datei eine Spalte mit der URL zum Produktbild enthalten, damit der Import in den SHOP die Bilder dann von dem Ablageziel herunterladen und migrieren kann.
Die Excel Liste enthält nun die Produktbilder allerdings in Form von eingebetteten Dateien in jeder Artikelzeile. Diese müssen nun so automatisiert extrahiert werden und in einer neuen Spalte der genaue Dateiname eingefügt werden.
Beim automatisieren Speichern der Bilder in Dateien muss zuerst entschieden werden, wie die Dateinamen lauten sollen. Hierzu gibt es bei der folgenden Anleitung mehrere Möglichkeiten. Der Dateiname kann mit einer fortlaufenden Nummer gesetzt werden oder auch einen Beschreibungstext der jeweiligen Artikelzeile. In diesem Beispiel hat jedes eingebettetes Bild einen alternativen Text, welcher in den Eigenschaften des Bild angezeigt werden kann:
Damit die Daten automatisiert verarbeitet werden können, muss ein kleines Excel Makro erstellt werden. Damit diese Funktionen in Excel nutzbar sind, muss die Registrierkarte "Entwickler Tools" zuvor im Programm Menü eingeblendet werden:
Die Anzeige der Registrierkarte wird in den Excel Optionen über die Checkbox Entwicklerregistrierkarte in der Multifunktionszeile anzeigen aktiviert.
Nun kann ein neues Makro aufgezeichnet werden:
Nach Start der Aufzeichnung kann die Aufzeichnung sofort wieder beendet werden und die notwendigen Anpassungen über den Visual Basic Editor vorgenommen werden. nach Start des Editors sieht man den Quellcode des erstellten Makros:
Dieses wird nun durch den folgenden exemplarischen Inhalt ergänzt:
Sub Makro1()
dim i as integer
i=0
'Einfügen von neuen Spalten mit Bildnamen und zusätzlichen Beschreibungen in neue Spalten:
msg1 = " | Vorbestellung möglich.
For Each oShape In ActiveSheet.Shapes
If oShape.Type = msoPicture Then
i = i + 1
Set oTopLeft = oShape.TopLeftCell
'Beispiel um eine fortlaufenden Bildnamen in eine neue Spalte N einfügen zu lassen (verwenden wir nicht):
'ActiveSheet.Range("N" & oTopLeft.Row).Value = oShape.Name
'Beispiel um den alternativen Bildtext (sofern in den Eigenschaften des Bildes angegeben) in eine neue Spalte M einfügen zu lassen und die Zeichenkette .jpg mit daran anzuhängen (verwenden wir nicht):
'ActiveSheet.Range("M" & oTopLeft.Row).Value = oShape.AlternativeText & ".jpg"'
'Beispiel um den alternativen Bildtext (sofern in den Eigenschaften des Bildes angegeben) in eine neue Spalte M einfügen zu lassen, die Zeichenkette .jpg mit daran anzuhängen und eine Webadresse mit in die Zeichenkette einzufügen, wo das Bild später hochgeladen und erreichbar seinwird:
ActiveSheet.Range("L" & oTopLeft.Row).Value = "http://beispielwebserveradresse/wp-content/uploads/shop_images/" & oShape.AlternativeText & ".jpg"
'Beispiel um ebenfalls einen Standard Beschreibungstext zusammen mit dem Artikelnamen aus Spalte C in eine zusätzliche neue Spalte einzufügen:
ActiveSheet.Range("M" & oTopLeft.Row).Value = ActiveSheet.Range("C" & oTopLeft.Row).Value & msg1
End If
Next oShape
'Spaltentexte erweitern beendet
'Nun folgt das extrahieren der eingebetteten Bilder:
'Definition eines lokalen Ausgabeverzeichnis wohin die extrahierten Bilder gespeichert werden sollen :
Const saveSceenshotTo As String = "J:eigeneprojekteexcel_tricksBeispielbilder_export"
i=0
For Each oShape In ActiveSheet.Shapes
i = i + 1
'Dateiname für das aktuelle Bild generieren (Ausgabeverzeichnis+Text aus der Eigenschaft des alternative Bildtext)+Dateiendung .jpg:
'Alternativ kann statt des Alternativtext auch ein variablenzähler wie i an dieser Stelle verwendet werden
strImageName = saveSceenshotTo & oShape.AlternativeText & ".jpg"
oShape.Select
'Picture format initialization
Selection.ShapeRange.pictureFormat.Contrast = 0.5: Selection.ShapeRange.pictureFormat.Brightness = 0.5: Selection.ShapeRange.pictureFormat.ColorType = msoPictureAutomatic: Selection.ShapeRange.pictureFormat.TransparentBackground = msoFalse: Selection.ShapeRange.Fill.Visible = msoFalse: Selection.ShapeRange.Line.Visible = msoFalse: Selection.ShapeRange.Rotation = 0#: Selection.ShapeRange.pictureFormat.CropLeft = 0#: Selection.ShapeRange.pictureFormat.CropRight = 0#: Selection.ShapeRange.pictureFormat.CropTop = 0#: Selection.ShapeRange.pictureFormat.CropBottom = 0#: Selection.ShapeRange.ScaleHeight 1#, msoTrue, msoScaleFromTopLeft: Selection.ShapeRange.ScaleWidth 1#, msoTrue, msoScaleFromTopLeft
'/Ende:Picture format initialization
Application.Selection.CopyPicture
Set oDia = ActiveSheet.ChartObjects.Add(0, 0, oShape.Width, oShape.Height)
Set oChartArea = oDia.Chart
oDia.Activate
With oChartArea
.ChartArea.Select
.Paste
' jetzt wird die Datei mit dem Dateinamen in das Ausgabeverzeichnis gespeichert
.Export (strImageName)
DoEvents
End With
oDia.Delete 'oChartArea.Delete
Next
End Sub
Dieser Quellcode muss nun nach eventueller Anpassung der Spaltenbezeichnungen oder der Bildnamenvorgaben in den VB Editor in dem Bereich des neuen Makros eingefügt werden:
Nach Ausführen des Makros sollte die aktuelle Tabelle die ergänzten Spalten mit den Bilddateinamen bzw. des zukünftigen Bildpfades und eventuelle Beschreibungstexte enthalten und in dem definierten Ausgabeverzeichnis die extrahierten Bilder vorhanden sein:
Weiterverarbeitung der Bilder:
Die extrahierten Bild Dateien müssen nun manuell an den Speicherort kopiert werden wo diese später beim Artikelimport im WooCommerce SHOP System erreichbar sein sollen. Dies kann ein vorübergehendes Verzeichnis auf dem Webserver sein, da nach dem Import die Bilder im Hintergrund automatisch in die entsprechenden Verzeichnisse mirgriert werden.
Mit WinSCP lassen sich die Bilder bequem auf einen FTP oder sFTP Server übertragen:
Konvertieren der Excel Liste in eine CSV Datei:
Aus der Excel Liste sollten nun möglichst alle später nicht mehr benötigten Spalten entfernt werden damit die CSV Datei möglichst nur die relevanten Spalten enthält. Hierzu können in Excel die nicht mehr benötigten Spalten gelöscht werden:
Nach der abschließenden Bereinigung wird die Datei nun als CSV Datei gespeichert.
Nach dem Export kann die Datei Sicherheitshaber mit einem Texteditor wie Notepad++ kontrolliert werden. Sollten in der exportierten Liste aus Excel beispielsweise doch nicht alle unnötigen Spalten gelöscht wurden sein, so kann man mit Notepad++ beispielsweise die unnötigen CSV Trennzeichen über mehrere Zeilen mit folgender Tastenkombination leicht löschen (ALT+SHIFT gedrückt halten und dabei mit den Pfeiltasten nach rechts und unten den Bereich markieren:
Bei dem Import der Artikel in Woocommerce mit dem Importer Tool musste zudem die CSV Datei noch vom Windows ANSI Format in das UTF 8 Format konvertiert werden, damit Sonderzeichen in den Beschreibungstexten korrekt in die Artikeldatenbank, welche sich auf dem Linux Webserver befindet, eingefügt werden konnte. Diesen Schritt kann man mit Notepad++ ebenfalls leicht erledigen:
Jetzt sind als Vorbereitung zum Artikelimport die CSV Datei und Bilder vollständig erstellt worden und die Liste enthält die Bild URLs mit den jeweiligen Dateinamen des Artikel.
Tipp: Die weitere Beschreibung des Artikelimport in WooCommerce mit dem kostenlosen Import Plugin von XAdapter habe ich in diesem Beitrag beschrieben.
Hallo, Dein Beitrag und das Script sind wirklich ausgezeichnet. Was macht man wenn die Artikelbilder keinen Alternativtext beinhalten?