Ecrire dans une feuille de calcul Excel


149

Je suis nouveau sur Python. J'ai besoin d'écrire des données de mon programme dans une feuille de calcul. J'ai cherché en ligne et il semble y avoir de nombreux packages disponibles (xlwt, XlsXcessive, openpyxl). D'autres suggèrent d'écrire dans un fichier .csv (jamais utilisé CSV et ne comprennent pas vraiment ce que c'est).

Le programme est très simple. J'ai deux listes (float) et trois variables (strings). Je ne connais pas la longueur des deux listes et elles ne seront probablement pas de la même longueur.

Je veux que la mise en page soit comme dans l'image ci-dessous:

Exemple de mise en page

La colonne rose aura les valeurs de la première liste et la colonne verte aura les valeurs de la deuxième liste.

Alors, quelle est la meilleure façon de faire cela?

PS J'utilise Windows 7 mais je n'aurai pas nécessairement Office installé sur les ordinateurs exécutant ce programme.

import xlwt

x=1
y=2
z=3

list1=[2.34,4.346,4.234]

book = xlwt.Workbook(encoding="utf-8")

sheet1 = book.add_sheet("Sheet 1")

sheet1.write(0, 0, "Display")
sheet1.write(1, 0, "Dominance")
sheet1.write(2, 0, "Test")

sheet1.write(0, 1, x)
sheet1.write(1, 1, y)
sheet1.write(2, 1, z)

sheet1.write(4, 0, "Stimulus Time")
sheet1.write(4, 1, "Reaction Time")

i=4

for n in list1:
    i = i+1
    sheet1.write(i, 0, n)



book.save("trial.xls")

J'ai écrit ceci en utilisant toutes vos suggestions. Il fait le travail, mais il peut être légèrement amélioré.

Comment formater les cellules créées dans la boucle for (valeurs list1) en tant que scientifiques ou numériques?

Je ne veux pas tronquer les valeurs. Les valeurs réelles utilisées dans le programme auraient environ 10 chiffres après la virgule.


Vous comprendrez ce qu'est un fichier tsv si vous l'ouvrez dans un éditeur de texte tel que notepad / wordpad. Le principal avantage de l'utilisation de tsv est que vous pouvez être sûr que pratiquement n'importe quelle version de n'importe quel tableur peut l'ouvrir, et pas seulement excel d'Office 2010
goncalopp

Utilisez le format de chaîne en python pour contrôler l'affichage des données numériques.
Fred Mitchell

vérifiez openpyxl pour travailler avec les fichiers .xlsx
Santiago

Réponses:


95
import xlwt

def output(filename, sheet, list1, list2, x, y, z):
    book = xlwt.Workbook()
    sh = book.add_sheet(sheet)

    variables = [x, y, z]
    x_desc = 'Display'
    y_desc = 'Dominance'
    z_desc = 'Test'
    desc = [x_desc, y_desc, z_desc]

    col1_name = 'Stimulus Time'
    col2_name = 'Reaction Time'

    #You may need to group the variables together
    #for n, (v_desc, v) in enumerate(zip(desc, variables)):
    for n, v_desc, v in enumerate(zip(desc, variables)):
        sh.write(n, 0, v_desc)
        sh.write(n, 1, v)

    n+=1

    sh.write(n, 0, col1_name)
    sh.write(n, 1, col2_name)

    for m, e1 in enumerate(list1, n+1):
        sh.write(m, 0, e1)

    for m, e2 in enumerate(list2, n+1):
        sh.write(m, 1, e2)

    book.save(filename)

pour plus d'explications: https://github.com/python-excel


13
Vous voudrez peut-être mentionner que si vous exécutez Python sur Windows et qu'Excel est installé sur la même machine, vous pouvez utiliser l'interface COM Python pour contrôler directement Excel.
Michael Dillon

1
Le lien a été très utile. Merci
Jey

3
Notez simplement qu'avec ce code, la limite maximale de lignes est de 65536 lignes, car les fichiers .xls ne prennent en charge que ce nombre de lignes
Shreyas Pimpalgaonkar

1
Pour être clair, xlwtc'est uniquement pour écrire les anciens .xlsfichiers pour Excel 2003 ou une version antérieure. Cela peut être obsolète (selon vos besoins).
cowlinator

Vous pouvez vérifier openpyxl pour travailler avec les fichiers .xlsx
Santiago

140

Utilisez DataFrame.to_excel de pandas . Pandas vous permet de représenter vos données dans des structures de données fonctionnellement riches et vous permettra de lire fichiers Excel.

Vous devrez d'abord convertir vos données en DataFrame, puis les enregistrer dans un fichier Excel comme ceci:

In [1]: from pandas import DataFrame
In [2]: l1 = [1,2,3,4]
In [3]: l2 = [1,2,3,4]
In [3]: df = DataFrame({'Stimulus Time': l1, 'Reaction Time': l2})
In [4]: df
Out[4]: 
   Reaction Time  Stimulus Time
0              1              1
1              2              2
2              3              3
3              4              4

In [5]: df.to_excel('test.xlsx', sheet_name='sheet1', index=False)

et le fichier Excel qui sort ressemble à ceci:

entrez la description de l'image ici

Notez que les deux listes doivent être de longueur égale, sinon les pandas se plaindront. Pour résoudre ce problème, remplacez toutes les valeurs manquantes par None.


Merci mais semble trop compliqué pour mes besoins.
Jey

Belle, mais un peu exagérée +1
Burhan Khalid

2
À peu près sûr que les pandas utilisent les bibliothèques xlrd / xlwt pour ses capacités Excel pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey

6
Je supposais qu'il était utilisé xlwtaussi, mais j'obtenais une openpyxlerreur. Pour tous ceux qui sont confus par cela, tout est dans le type de fichier souhaité. La documentation pandas (0.12) dit: "Les fichiers avec une .xlsextension seront écrits en utilisant xlwt et ceux avec une .xlsxextension seront écrits en utilisant openpyxl".
Racing Tadpole

5
Je ne sais pas pourquoi les gens disent que c'est exagéré. Pour mes besoins, c'était exactement ce que je recherchais. Merci!
Abe

35
  • xlrd / xlwt (standard): Python n'a pas cette fonctionnalité dans sa bibliothèque standard, mais je considère xlrd / xlwt comme la manière "standard" de lire et d'écrire des fichiers Excel. Il est assez facile de créer un classeur, d'ajouter des feuilles, d'écrire des données / formules et de formater des cellules. Si vous avez besoin de toutes ces choses, vous aurez peut-être le plus de succès avec cette bibliothèque. Je pense que vous pourriez choisir openpyxl à la place et ce serait assez similaire, mais je ne l'ai pas utilisé.

    Pour mettre en forme des cellules avec xlwt, définissez a XFStyleet incluez le style lorsque vous écrivez sur une feuille. Voici un exemple avec de nombreux formats de nombres . Voir l'exemple de code ci-dessous.

  • Tablib (puissant, intuitif): Tablib est une bibliothèque plus puissante mais intuitive pour travailler avec des données tabulaires. Il peut écrire des classeurs Excel avec plusieurs feuilles ainsi que d'autres formats, tels que csv, json et yaml. Si vous n'avez pas besoin de cellules formatées (comme la couleur de fond), vous vous ferez une faveur pour utiliser cette bibliothèque, ce qui vous mènera plus loin à long terme.

  • csv (facile): Les fichiers sur votre ordinateur sont soit du texte ou binaire . Les fichiers texte ne sont que des caractères, y compris des caractères spéciaux comme les nouvelles lignes et les onglets, et peuvent être facilement ouverts n'importe où (par exemple, le bloc-notes, votre navigateur Web ou les produits Office). Un fichier csv est un fichier texte qui est formaté d'une certaine manière: chaque ligne est une liste de valeurs, séparées par des virgules. Les programmes Python peuvent facilement lire et écrire du texte, donc un fichier csv est le moyen le plus simple et le plus rapide d'exporter des données de votre programme python vers excel (ou un autre programme python).

    Les fichiers Excel sont binaires et nécessitent des bibliothèques spéciales qui connaissent le format de fichier, c'est pourquoi vous avez besoin d'une bibliothèque supplémentaire pour python, ou d'un programme spécial comme Microsoft Excel, Gnumeric ou LibreOffice, pour les lire / écrire.


import xlwt

style = xlwt.XFStyle()
style.num_format_str = '0.00E+00'

...

for i,n in enumerate(list1):
    sheet1.write(i, 0, n, fmt)

2
Vous voudrez probablement utiliser le module csv inclus dans la bibliothèque standard si vous allez écrire un fichier CSV.
Flimm

1
Ce n'est pas que cela compte particulièrement, mais Tablib, comme tant d'autres packages de niveau supérieur, utilise xlwt pour générer des fichiers Excel.
John Y

13

J'ai étudié quelques modules Excel pour Python et j'ai trouvé openpyxl le meilleur.

Le livre gratuit Automate the Boring Stuff with Python contient un chapitre sur openpyxl avec plus de détails ou vous pouvez consulter le site Lire la documentation . Vous n'aurez pas besoin d'installer Office ou Excel pour utiliser openpyxl.

Votre programme ressemblerait à ceci:

import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')

stimulusTimes = [1, 2, 3]
reactionTimes = [2.3, 5.1, 7.0]

for i in range(len(stimulusTimes)):
    sheet['A' + str(i + 6)].value = stimulusTimes[i]
    sheet['B' + str(i + 6)].value = reactionTimes[i]

wb.save('example.xlsx')

Je reçois une erreur disant: impossible de convertir int64 en excel
pnkjmndhl

11

CSV signifie des valeurs séparées par des virgules. CSV est comme un fichier texte et peut être créé simplement en ajoutant le extension .CSV

par exemple écrivez ce code:

f = open('example.csv','w')
f.write("display,variable x")
f.close()

vous pouvez ouvrir ce fichier avec Excel.


5
Vous ne pouvez pas formater les arrière-plans des colonnes à l'aide de CSV. Ce n'est qu'un format de données pour l'importation et l'exportation.
Michael Dillon

5
Vous voudrez probablement utiliser le module csv inclus dans la bibliothèque standard si vous comptez faire cela. Il gère mieux les citations, par exemple.
Flimm

@Flimm Comment écrire simplement dans différentes cellules?
oldboy

si vous utilisez Python 3 et que le fichier contient des caractères non ASCII, comme éou , vous feriez mieux de faire f.write('\xEF\xBB\xBF')juste après le open(). C'est la nomenclature ( marque d'ordre d'octet , qv), nécessaire au logiciel Microsoft pour reconnaître l'encodage UTF-8
Walter Tross

10
import xlsxwriter


# Create an new Excel file and add a worksheet.
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()

# Widen the first column to make the text clearer.
worksheet.set_column('A:A', 20)

# Add a bold format to use to highlight cells.
bold = workbook.add_format({'bold': True})

# Write some simple text.
worksheet.write('A1', 'Hello')

# Text with formatting.
worksheet.write('A2', 'World', bold)

# Write some numbers, with row/column notation.
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)

# Insert an image.
worksheet.insert_image('B5', 'logo.png')

workbook.close()

7

Essayez également de jeter un œil aux bibliothèques suivantes:

xlwings - pour obtenir des données dans et hors d'une feuille de calcul à partir de Python, ainsi que pour manipuler des classeurs et des graphiques

ExcelPython - un complément Excel pour écrire des fonctions définies par l'utilisateur (UDF) et des macros en Python au lieu de VBA


2

OpenPyxl est une bibliothèque assez sympa, construite pour lire / écrire des fichiers xlsx / xlsm Excel 2010:

https://openpyxl.readthedocs.io/en/stable

L'autre réponse , qui y fait référence, utilise la fonction déperciée ( get_sheet_by_name). Voici comment le faire sans cela:

import openpyxl

wbkName = 'New.xlsx'        #The file should be created before running the code.
wbk = openpyxl.load_workbook(wbkName)
wks = wbk['test1']
someValue = 1337
wks.cell(row=10, column=1).value = someValue
wbk.save(wbkName)
wbk.close

1
Le code ci-dessus produit une erreurFileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Atinesh

@Atinesh - Merci pour les commentaires - openpyxl.load_workbookcharge un classeur, qui est déjà présent. Créez un fichier New.xlsxpour éviter cette erreur.
Vityata

1
OK Merci pour la suggestion
Atinesh

Notez qu'openpyxl ne prend pas en charge l'ancien format «xls».
Timothy C. Quinn

2

La xlsxwriterbibliothèque est idéale pour créer des .xlsxfichiers. L'extrait .xlsxde code suivant génère un fichier à partir d'une liste de dictés tout en indiquant l' ordre et les noms affichés :

from xlsxwriter import Workbook


def create_xlsx_file(file_path: str, headers: dict, items: list):
    with Workbook(file_path) as workbook:
        worksheet = workbook.add_worksheet()
        worksheet.write_row(row=0, col=0, data=headers.values())
        header_keys = list(headers.keys())
        for index, item in enumerate(items):
            row = map(lambda field_id: item.get(field_id, ''), header_keys)
            worksheet.write_row(row=index + 1, col=0, data=row)


headers = {
    'id': 'User Id',
    'name': 'Full Name',
    'rating': 'Rating',
}

items = [
    {'id': 1, 'name': "Ilir Meta", 'rating': 0.06},
    {'id': 2, 'name': "Abdelmadjid Tebboune", 'rating': 4.0},
    {'id': 3, 'name': "Alexander Lukashenko", 'rating': 3.1},
    {'id': 4, 'name': "Miguel Díaz-Canel", 'rating': 0.32}
]

create_xlsx_file("my-xlsx-file.xlsx", headers, items)

entrez la description de l'image ici


💡 Remarque 1 - Je ne réponds volontairement pas au cas exact présenté par le PO. Au lieu de cela, je présente une solution plus générique à mon humble avis la plupart des visiteurs recherchent. Le titre de cette question est bien indexé dans les moteurs de recherche et suit beaucoup de trafic

entrez la description de l'image ici

💡 Remarque 2 - Si vous n'utilisez pas Python3.6 ou plus récent, envisagez d'utiliser OrderedDictin headers. Avant Python3.6, l'ordre dans dictn'était pas conservé.



0

Le moyen le plus simple d'importer les nombres exacts consiste à ajouter une décimale après les nombres dans votre l1et l2. Python interprète ce point décimal comme des instructions de votre part pour inclure le nombre exact. Si vous devez le limiter à une décimale, vous devriez pouvoir créer une commande d'impression qui limite la sortie, quelque chose de simple comme:

print variable_example[:13]

Le limiterait à la dixième décimale, en supposant que vos données aient deux entiers à gauche de la décimale.


0

Vous pouvez essayer la bibliothèque python orientée objet hfexcel Human Friendly basée sur XlsxWriter :

from hfexcel import HFExcel

hf_workbook = HFExcel.hf_workbook('example.xlsx', set_default_styles=False)

hf_workbook.add_style(
    "headline", 
    {
       "bold": 1,
        "font_size": 14,
        "font": "Arial",
        "align": "center"
    }
)

sheet1 = hf_workbook.add_sheet("sheet1", name="Example Sheet 1")

column1, _ = sheet1.add_column('headline', name='Column 1', width=2)
column1.add_row(data='Column 1 Row 1')
column1.add_row(data='Column 1 Row 2')

column2, _ = sheet1.add_column(name='Column 2')
column2.add_row(data='Column 2 Row 1')
column2.add_row(data='Column 2 Row 2')


column3, _ = sheet1.add_column(name='Column 3')
column3.add_row(data='Column 3 Row 1')
column3.add_row(data='Column 3 Row 2')

# In order to get a row with coordinates:
# sheet[column_index][row_index] => row
print(sheet1[1][1].data)
assert(sheet1[1][1].data == 'Column 2 Row 2')

hf_workbook.save()

0

Si votre besoin est de modifier un classeur existant, le moyen le plus sûr serait d'utiliser pyoo . Vous devez avoir quelques bibliothèques installées et cela prend quelques obstacles pour sauter à travers mais une fois sa mise en place, ce serait à toute épreuve car vous exploitez les API larges et solides de LibreOffice / OpenOffice.

S'il vous plaît voir mon Gist sur la façon de configurer un système Linux et de faire un codage de base en utilisant pyoo.

Voici un exemple de code:

#!/usr/local/bin/python3
import pyoo
# Connect to LibreOffice using a named pipe 
# (named in the soffice process startup)
desktop = pyoo.Desktop(pipe='oo_pyuno')
wkbk = desktop.open_spreadsheet("<xls_file_name>")
sheet = wkbk.sheets['Sheet1']
# Write value 'foo' to cell E5 on Sheet1
sheet[4,4].value='foo'
wkbk.save()
wkbk.close()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.