Je suis nouveau sur Python. Je dois écrire certaines données de mon programme dans un tableur. J'ai cherché en ligne et il semble y avoir beaucoup de paquets disponibles (xlwt, XlsXcessive, openpyxl). D'autres suggèrent d'écrire dans un fichier .csv (jamais utilisé CSV et ne comprend pas vraiment ce que c'est).
Le programme est très simple. J'ai deux listes (float) et trois variables (chaînes). Je ne connais pas les longueurs des deux listes et elles ne seront probablement pas les mêmes.
Je veux que la mise en page soit comme dans l'image ci-dessous:
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?
P.S. J'utilise Windows 7 mais Office ne sera pas nécessairement 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. Le travail est fait mais peut être légèrement amélioré.
Comment formater les cellules créées dans la boucle for (valeurs list1) sous forme scientifique ou numérique?
Je ne veux pas tronquer les valeurs. Les valeurs réelles utilisées dans le programme auraient environ 10 chiffres après la virgule.
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'explication: https://github.com/python-Excel
Utilisez DataFrame.to_Excel de pandas . Les pandas vous permettent de représenter vos données dans des infrastructures de données riches en fonctionnalités et vous permettent également de lire fichiers Excel.
Vous devrez d’abord convertir vos données dans un 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:
Notez que les deux listes doivent être de longueur égale, sinon les pandas vont se plaindre. Pour résoudre ce problème, remplacez toutes les valeurs manquantes par None
.
xlrd/xlwt (standard): Python ne possède pas cette fonctionnalité dans sa bibliothèque standard, mais je pense que xlrd/xlwt est le moyen "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 formater les cellules avec xlwt, définissez une XFStyle
et incluez le style lorsque vous écrivez sur une feuille. Voici un exemple avec plusieurs formats de nombre . Voir exemple de code ci-dessous.
Tablib (puissant, intuitif): Tablib est une bibliothèque plus puissante et 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 d'arrière-plan), vous vous ferez une faveur d'utiliser cette bibliothèque, qui vous mènera plus loin à long terme.
csv (facile): Les fichiers sur votre ordinateur sont soit texte ou binaire. Les fichiers texte ne sont que des caractères, y compris des caractères spéciaux tels que des nouvelles lignes et des tabulations, et peuvent être facilement ouverts n’importe où (bloc-notes, navigateur Web ou produits Office, par exemple). Un fichier csv est un fichier texte formaté d’une certaine manière: chaque ligne est une liste de valeurs, séparées par des virgules. Les programmes Python pouvant facilement lire et écrire du texte, un fichier csv est le moyen le plus simple et le plus rapide pour 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 connaissant le format de fichier. C'est pourquoi vous avez besoin d'une bibliothèque supplémentaire pour Python ou d'un programme spécial tel que 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)
CSV est synonyme de valeurs séparées par des virgules. CSV est comme un fichier texte et peut être créé simplement en ajoutant l’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.
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()
Essayez également de consulter les bibliothèques suivantes:
xlwings - pour importer des données dans un tableur à partir de Python, ainsi que pour manipuler des classeurs et des graphiques
ExcelPython - un complément Excel pour l'écriture de fonctions définies par l'utilisateur (UDF) et de macros en Python au lieu de VBA
J'ai étudié quelques modules Excel pour Python et trouvé que openpyxl était 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 Read the Docs . Vous n'avez pas besoin d'installer Office ou Excel pour utiliser openpyxl.
Votre programme ressemblerait à quelque chose comme ça:
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')
OpenPyxl
est une jolie bibliothèque, conçue pour lire/écrire des fichiers xlsx/xlsm Excel 2010:
https://openpyxl.readthedocs.io/fr/stable
L'autre réponse , qui s'y réfère utilise la fonction diminué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
Le moyen le plus simple d'importer les nombres exacts est d'ajouter une décimale après les nombres de vos l1
et l2
. Python interprète ce point décimal comme une instruction de votre part d'inclure le nombre exact. Si vous devez le limiter à une décimale, vous devriez pouvoir créer une commande d'impression qui limite le résultat, comme par exemple:
print variable_example[:13]
La limiterait à la dixième décimale, en supposant que vos données ont deux nombres entiers à gauche de la décimale.
Vous pouvez essayer hfexcel Bibliothèque python orientée objet, conviviale pour l'homme, 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()