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.