Konvertierung in Masse – *.xls zu *.xlsx

Problemstellung

Strukturen sind oft über Jahre wenn nicht Jahrzehnte gewachsen. So auch Datenmengen und deren Formatierungen. Damit nun alle ein einheitliches Format haben und auch in der Cloud besser alle Office-Dokumente im OpenXML-Format vorliegen, sollten diese nun konvertiert werden.

Lösungsansatz

Schritt für Schritt

Aufgrund der Masse der Dateien macht es Sinn, sich mal kurz ein Tool zu basteln. Bei wenigen Dateien ist das vielleicht etwas oversized, aber bei <Öffnen – Speichern unter – Format wählen – Speichern> von immerhin (wenn man fix ist) 30sec. sind das bei 10 Dateien schon 5min+. Sind es mehr als 40-50 Dateien mit dem gleichen Problem lohnt sich der Programmieraufwand.

Nach kurzer Suche stößt man auf zB excellent-conversions-and-downloads und damit auf die etwas schnellere Möglichkeit zur Konvertierung (hier mit Excel und unter Windows):

"<path to file>/excelcnv.exe" -oics "<quelldatei.xls>" "<zieldatei.xlsx>"

Immerhin kann so das Öffnen von und geklickere in Excel eingespart werden, doch richtig smart ist das noch nicht. Also diesen Ansatz ab in einen Batch und um Schleifen (siehe zB. tutorial-zur-for-schleife) und Abfragen erweitert.

Das ganze geht aber auch mit Opensource, zB. mit LibreOffice. Je nach System muss noch der Pfad angegeben werden:

#Windos
"<path to file>\soffice.exe" --convert-to xlsx "<quelldatei.xls>" -outdir "<zielpfad>"
#Linux
libreoffice --convert-to xlsx ./<quelldatei.xls> --outdir <zielpfad>

In beiden Systemen kann man übrigens mit „./“ bzw „.\“ auf den ausführenden Pfad relativ verweisen, wenn man die erzeugten Dateien ins gleiche Verzeichnis ablegen möchte.

Do it in a Loop

Nun geht’s einen Schritt weiter: Was für eine Datei manuell geht, kann auch gut in eine Schleife gegossen werden.

#Windows (Batch)
for /R %%f (*.xls) do "<Pfad zum Programm>" <Paramerter> %%f & "<Pfad zum Programm>" <Paramerter> %%f
#Linux (Shell-Script)
for file in *.xls do
    <Pfad zum Programm> <Paramerter> $file
    <Pfad zum Programm> <Paramerter> $file
done

Unter Windows wird nun noch stark zwischen der 32bit und der 64bit-Installation unterschieden, weshalb eine Abfrage vor der Schleife interessant ist:

set convert32="<pfad bei 32bit>"
set convert64="<pfad bei 64bit>"

IF EXIST %convert32% (
    set convert=%convert32%
) ELSE IF EXIST %convert64% (
    set convert=%convert64%
) ELSE (
    echo weder %convert32% noch %convert64% verfügbar
    exit
)

Und es wäre ja auch noch nett, wenn dann nur noch die konvertierten Dateien im Verzeichnis verbleiben und die alten in Unterordner „alt“ verschoben werden:

#Windows
IF NOT EXIST .\alt\ (mkdir alt)
move .\<Dateiname> .\alt\<Dateiname>
#Linux
if [ ! -d "./alt" ]; then
  mkdir ./alt
fi
mv ./<Dateiname> ./alt/<Dateiname>

Nun basteln wir die Puzzle-Stücke zusammen:

@echo off
REM Lösung unter Windows

set convert32="<pfad bei 32bit>"
set convert64="<pfad bei 64bit>"

IF EXIST %convert32% (
    set convert=%convert32%
) ELSE IF EXIST %convert64% (
    set convert=%convert64%
) ELSE (
    echo weder %convert32% noch %convert64% verfügbar
    exit
)

IF NOT EXIST .\alt\ (mkdir alt)

for /R %%f (*.xls) do "<path to file>\soffice.exe" --convert-to xlsx "%%f" -outdir ./ & move ".\%%f" ".\alt\%%f"
#Linux (Shell-Script)
#!/bin/bash
if [ ! -d "./alt" ]; then
  mkdir ./alt
fi

for file in *.xls; do
    libreoffice --convert-to xlsx ./"$file" --outdir ./
    mv ./"$file" ./alt/"$file"
done

Fazit: Mit etwas suchen und ein wenig Übung lassen sich viele Probleme recht einfach automatisiert abarbeiten. Noch schöner lässt sich das zB. in der Powershell oder der UNIX-Shell umsetzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert