web-dev-qa-db-fra.com

Modifier des classeurs et des feuilles de calcul Excel existants avec xlrd et xlwt

Dans le documentation pour xlrd et xlwt, j'ai appris ce qui suit:

Comment lire des cahiers/fiches existants:

from xlrd import open_workbook
wb = open_workbook("ex.xls")
s = wb.sheet_by_index(0)
print s.cell(0,0).value
#Prints contents of cell at location a1 in the first sheet in the document called ex.xls

Comment créer de nouveaux cahiers/feuilles de travail:

from xlwt import Workbook
wb = Workbook()
Sheet1 = wb.add_sheet('Sheet1')
Sheet1.write(0,0,'Hello')
wb.save('ex.xls')
#Creates a document called ex.xls with a worksheet called "Sheet1" and writes "Hello" to the cell located at a1

Ce que je veux faire maintenant, c'est ouvrir une feuille de calcul existante, dans un classeur existant, et écrire dans cette feuille.

J'ai essayé quelque chose comme:

from xlwt import open_workbook
wb = open_workbook("ex.xls")
s = wb.sheet_by_index(0)
print s.cell(0,0).value

mais open_workbook n'est qu'une partie du module xlrd, pas xlwt.

Des idées?

Edit1: Après la suggestion d’Olivers, j’ai étudié xlutils et essayé ce qui suit:

from xlrd import open_workbook
from xlwt import Workbook
from xlutils.copy import copy

wb = open_workbook("names.xls")
s = wb.get_sheet(0)
s.write(0,0,'A1')
wb.save('names.xls')

Cela me donne toutefois le message d'erreur suivant:

File "C:\Python27\lib\site-packages\xlrd\book.py", line 655, in get_sheet
raise XLRDError("Can't load sheets after releasing resources.")
xlrd.biffh.XLRDError: Can't load sheets after releasing resources.

Edit 2: le message d'erreur était dû à une utilisation incorrecte du get_sheet une fonction. Enfin découvert comment l'utiliser:

from xlrd import open_workbook
from xlwt import Workbook
from xlutils.copy import copy

rb = open_workbook("names.xls")
wb = copy(rb)

s = wb.get_sheet(0)
s.write(0,0,'A1')
wb.save('names.xls')
26
Jack Pettersson

Comme je l'ai écrit dans les modifications de l'opération, pour modifier des documents Excel existants, vous devez utiliser le module xlutils (merci Oliver).

Voici la bonne façon de le faire:

#xlrd, xlutils and xlwt modules need to be installed.  
#Can be done via pip install <module>
from xlrd import open_workbook
from xlutils.copy import copy

rb = open_workbook("names.xls")
wb = copy(rb)

s = wb.get_sheet(0)
s.write(0,0,'A1')
wb.save('names.xls')

Ceci remplace le contenu de la cellule située en a1 dans la première feuille de "names.xls" par le texte "a1", puis enregistre le document.

42
Jack Pettersson

Voici une autre façon de faire le code ci-dessus en utilisant le module openpyxl compatible avec xlsx. D'après ce que j'ai vu jusqu'à présent, il conserve également le formatage.

from openpyxl import load_workbook
wb = load_workbook('names.xlsx')
ws = wb['SheetName']
ws['A1'] = 'A1'
wb.save('names.xlsx')
12
Noah