J'ai un projet dans lequel je dois décompresser des fichiers contenant un fichier .xls, puis exécuter un script Python pour convertir le fichier en .xlsx. Je dois le faire en exécutant un fichier batch Windows via le planificateur de tâches Windows. J'ai trouvé du code sur Superuser pour décompresser le fichier, mais il ne boucle pas et vous devez taper explicitement le nom du fichier que vous souhaitez décompresser.

Voici le code de décompression :

@echo off
setlocal
cd /d %~dp0
Call :UnZipFile "C:\Test Folder\" "C:\Test Folder\File1.zip"
exit /b

:UnZipFile <ExtractTo> <newzipfile>
IF "%~dp0"=="" GOTO Continue
set vbs="%temp%\_.vbs"
if exist %vbs% del /f /q %vbs%
>%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo If NOT fso.FolderExists(%1) Then
>>%vbs% echo fso.CreateFolder(%1)
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items
>>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing
cscript //nologo %vbs%
if exist %vbs% del /f /q %vbs%

Voici mon code Python:

import win32com.client as win32
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--sourcefilepath')
parser.add_argument('--sourcefilename')
args = parser.parse_args()

fname = r"{sourcefilepath}{sourcefilename}".format(sourcefilepath=args.sourcefilepath,sourcefilename=args.sourcefilename)

excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(fname)
wb.SaveAs(fname + "x", FileFormat = 56)

wb.Close()                                 
excel.Application.Quit()
quit()

Toute aide sera appréciée.

0
ben 20 févr. 2020 à 12:59

1 réponse

Meilleure réponse
@echo off
setlocal
cd /d "%~dp0" || exit /b 1

for %%A in (*.zip) do (
    call :UnZipFile "%cd%\" "%%~fA"

    for %%B in (*.xls) do (
        echo python mypython.py --sourcefilepath "%cd%" --sourcefilename "%%~nxB"
        del "%%~B"
    )
)
exit /b

:UnZipFile <ExtractTo> <newzipfile>
if "%~dp0" == "" exit /b 1
set "vbs=%temp%\_.vbs"
if exist "%vbs%" del /f /q "%vbs%"

(
    echo Set fso = CreateObject("Scripting.FileSystemObject"^)
    echo If NOT fso.FolderExists("%~1"^) Then
    echo fso.CreateFolder("%~1"^)
    echo End If
    echo set objShell = CreateObject("Shell.Application"^)
    echo set FilesInZip=objShell.NameSpace("%~2"^).items
    echo objShell.NameSpace("%~1"^).CopyHere FilesInZip, 16
    echo Set fso = Nothing
    echo Set objShell = Nothing
) > "%vbs%"

cscript //nologo "%vbs%"
if exist "%vbs%" del /f /q "%vbs%"

Juste quelques corrections mineures aux caractères spéciaux nécessitant un échappement dans les commandes echo. Remplacé goto continue par exit /b 1. Ajout d'une simple boucle for pour obtenir tous les noms de fichiers zip.

Il obtiendra les fichiers xls dans le répertoire actuel et supprimera les fichiers xls une fois que le script python aura effectué la tâche SaveAs.

Supprimez echo devant la commande python si coché comme OK.


Ou essayez ce code python qui effectue la boucle, la décompression et xls à xlsx.

import win32com.client as win32
import argparse
import glob
import os
import zipfile

def xls_to_xlsx(filename, filepath=None):
    if not filepath:
        filepath = os.getcwd()

    fname = os.path.join(filepath, filename)

    excel = win32.gencache.EnsureDispatch('Excel.Application')
    wb = excel.Workbooks.Open(fname)
    wb.SaveAs(fname + "x", FileFormat = 56)

    wb.Close()
    excel.Application.Quit()

if __name__ == '__main__':
    for zip_file in glob.iglob('*.zip'):
        with zipfile.ZipFile(zip_file) as r:
            r.extractall()

        for xls_file in glob.iglob('*.xls'):
            xls_to_xlsx(xls_file)
            os.remove(xls_file)

Il ne définit pas le répertoire de travail actuel que le planificateur de tâches peut le définir, ou vous pouvez l'ajouter dans le script python pour le définir.

1
michael_heath 21 févr. 2020 à 03:07