web-dev-qa-db-fra.com

Convertir des feuilles de calcul .xls / .xlsx en plusieurs fichiers .csv basés sur une liste

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.

8
csheth

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')
8
pLumo

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
6
muru

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.

2
pLumo

Utilisez Gnumeric:

ssconvert -S filename.xlsx filename.csv

obtenir un fichier csv par feuille.

0
James Hirschorn