J'ai besoin de convertir toutes les feuilles d'un fichier .xls/.xlsx en un fichier .csv. Cela sera fait sur tous les fichiers .xls de tous les répertoires et sous-répertoires (de manière récursive).
Étape 1: Obtenez les noms de feuilles de tous les fichiers .xls dans un fichier .csv en utilisant:
for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done
filename-sheetnames-list.csv
peut agir comme une liste:
sheetname1
sheetname2
sheetname3
Step 2: Le code permettant de convertir une feuille spécifique en un fichier .csv à l'aide d'in2csv est le suivant:
in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv
Comment obtenir chaque nom de feuille dans un fichier .xls/x et écrire chaque feuille séparément pour tous les répertoires contenant un fichier .xls/x?
in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv ....
donne la sortie uniquement sur sheet1.csv, ne sachant pas comment obtenir toutes les feuilles à partir de ceci.
Vous pouvez simplement mettre une boucle dans une autre boucle.
Pour éviter les erreurs, n'utilisez pas for
avec les résultats find
.
while IFS= read -r file; do
while IFS= read -r sheet; do
in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
done < <(in2csv -n "$file")
done < <(find . -name '*.xls' -o -name '*.xlsx')
Sauter rechercher et utiliser bash:
shopt -s globstar # enable recursive globbing
for f in **/*.xls{,x} # for files ending in .xls or .xlsx
do
in2csv -n "$f" | # get the sheetnames
xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
done
version de csvkit> 1.0.2 a une fonction intégrée pour écrire toutes les feuilles:
--write-sheets: WRITE_SHEETS
The names of the Excel sheets to write to files, or
"-" to write all sheets.
Donc, vous pouvez essayer ce qui suit:
find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} \;
Remarque:
Cela ne semble pas fonctionner à 100% comme prévu. Mais cela vaut la peine d'essayer et, comme c'est la première version avec cette option, peut-être que dans les futures versions, la mise en œuvre est meilleure/plus simple.
Utilisez Gnumeric
:
ssconvert -S filename.xlsx filename.csv
obtenir un fichier csv
par feuille.