2016-12-06 2 views
1

Je suis en train d'utiliser win32com pour convertir plusieurs fichiers XLSX dans xls en utilisant le code suivant:Python win32com « nombre de paramètres incorrect »

import win32com.client 

f = r"./input.xlsx" 
xl = win32com.client.gencache.EnsureDispatch('Excel.Application') 
wb = xl.Workbooks.Open(f) 
xl.ActiveWorkbook.SaveAs("./somefile.xls", FileFormat=56) 

qui échoue avec l'erreur suivante:

Traceback (most recent call last): 
    File "xlsx_conv.py", line 6, in <module> 
    xl.ActiveWorkbook.SaveAs("./somefile.xls", FileFormat=56) 
    File "C:\python27\lib\site-packages\win32com\gen_py\00020813-0000-0000-C000-000000000046x0x1x9.py", line 46413, in SaveAs 
    , Local, WorkIdentity) 
pywintypes.com_error: (-2147352562, 'Invalid number of parameters.', None, None) 

Certains plus de détails:

Je peux faire d'autres commandes au classeur, par exemple wb.Worksheets.Add() et définir xl.Visible=True pour afficher le classeur. et même faire mais ne peut pas faire un wb.SaveAs()

+0

Je ne pense pas que le message d'erreur soit complet, et que vous l'ayez obtenu à partir du code que vous avez posté, pouvez-vous vérifier attentivement? – Schollii

Répondre

1

L'exception COM est due à l'argument de nom de fichier manquant car f = r"./input.xlsx" est introuvable. Si vous aviez utilisé Excel 2013+, vous auriez reçu un message d'exception plus précise avec un peu différent code d'erreur:

(-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', "Sorry, we couldn't find ./input.xlsx. Is it possible it was moved, renamed or deleted?", 'xlmain11.chm', 0, -2146827284), None)

Alors que votre chemin fonctionne dans le contexte natif de Python pointant vers le répertoire du script .py appelé réside, il ne pas en interface avec une API externe, comme Windows COM, comme le chemin complet est requis.

Pour résoudre, utilisez le os intégré de Python pour extraire le chemin de répertoire actuel du script et concaténer avec os.path.join() dans la méthode COM Excel. En outre, ci-dessous utilise try/except/finally pour terminer correctement le processus Excel.exe en arrière-plan, peu importe si une exception est levée ou non.

import os 
import win32com.client as win32 

cd = os.path.dirname(os.path.abspath(__file__)) 

try: 
    f = os.path.join(cd, "input.xlsx") 
    xl = win32.gencache.EnsureDispatch('Excel.Application') 
    wb = xl.Workbooks.Open(f) 
    xl.ActiveWorkbook.SaveAs(os.path.join(cd, "input.xls"), FileFormat=56) 
    wb.Close(True) 

except Exception as e: 
    print(e) 

finally: 
    wb = None 
    xl = None 
1

J'ai passé pas mal de temps à la recherche d'une solution appropriée, mais la seule chose que j'ai découvert est que le script, j'ai écrit hier aujourd'hui ne fonctionne pas. De plus, le même script fonctionne sur d'autres ordinateurs, donc je suppose que c'est quelque chose de cassé dans l'environnement windows/MsExcel/Python, mais je ne peux pas savoir où.

J'ai trouvé un travail autour des « Enregistrer sous » problème et il est juste d'utiliser le « Enregistrer » fonction. Heureusement, cela fonctionne toujours et ne m'empêche pas de poursuivre mes tâches. J'espère que cette aide

import win32com.client as win32 
from shutil import copyfile 

# you need to define these two: 
# src, is the absolute path to the excel file you want to open. 
# dst, is the where you want to save as the file. 

copyfile(src, dst) 

excel = win32.gencache.EnsureDispatch('Excel.Application') 
wb  = excel.Workbooks.Open(PATH_DATASET_XLS) 
ws  = wb.Worksheets(DATASET_WORKING_SHEET) 

# do some stuff 
ws.Cells(1, 'A').Value = "hello" 

# Saving changes 
wb.Save() # <- this is the work around 
excel.Application.Quit()