Scrivere su un foglio di calcolo Excel


149

Sono nuovo di Python. Devo scrivere alcuni dati dal mio programma su un foglio di calcolo. Ho cercato online e sembrano esserci molti pacchetti disponibili (xlwt, XlsXcessive, openpyxl). Altri suggeriscono di scrivere in un file .csv (non ha mai usato CSV e non capisco davvero di cosa si tratti).

Il programma è molto semplice Ho due liste (float) e tre variabili (stringhe). Non conosco le lunghezze delle due liste e probabilmente non avranno la stessa lunghezza.

Voglio che il layout sia come nell'immagine seguente:

Esempio di layout

La colonna rosa avrà i valori del primo elenco e la colonna verde avrà i valori del secondo elenco.

Qual è il modo migliore per farlo?

PS Sto eseguendo Windows 7 ma non avrò necessariamente Office installato sui computer che eseguono questo programma.

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")

L'ho scritto usando tutti i tuoi suggerimenti. Fa il lavoro ma può essere leggermente migliorato.

Come posso formattare le celle create nel ciclo for (elenco1 valori) come scientifiche o numeriche?

Non voglio troncare i valori. I valori effettivi utilizzati nel programma dovrebbero avere circa 10 cifre dopo il decimale.


Capirai cos'è un file tsv se lo apri in un editor di testo come Blocco note / WordPad. Il vantaggio principale dell'utilizzo di tsv è che puoi essere sicuro che praticamente qualsiasi versione di qualsiasi programma di foglio di calcolo può aprirlo, e non solo l'eccellenza di Office 2010
goncalopp,

Usa il formato stringa in Python per controllare la visualizzazione dei dati numerici.
Fred Mitchell,

controlla openpyxl per lavorare con i file .xlsx
Santiago,

Risposte:


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)

per ulteriori spiegazioni: https://github.com/python-excel


13
Potresti voler dire che se stai eseguendo Python su Windows e hai Excel installato sullo stesso computer, puoi usare l'interfaccia COM di Python per controllare direttamente Excel.
Michael Dillon,

1
Il link è stato molto utile. Grazie
Jey il

3
Basta notare che con questo codice il limite massimo di righe è 65536 righe, poiché i file .xls supportano solo quelle righe
Shreyas Pimpalgaonkar,

1
Per essere chiari, xlwtè solo per scrivere i vecchi .xlsfile per Excel 2003 o precedenti. Questo potrebbe essere obsoleto (a seconda delle tue esigenze).
cowlinator

Puoi controllare openpyxl per lavorare con file .xlsx
Santiago,

140

Usa DataFrame.to_excel dai panda . Pandas ti consente di rappresentare i tuoi dati in strutture di dati ricchi di funzionalità e ti permetterà di leggere anche in file Excel.

Dovrai prima convertire i tuoi dati in un DataFrame e poi salvarli in un file Excel in questo modo:

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)

e il file Excel che viene fuori è simile al seguente:

inserisci qui la descrizione dell'immagine

Nota che entrambi gli elenchi devono avere la stessa lunghezza, altrimenti i panda si lamenteranno. Per risolvere questo, sostituire tutti i valori mancanti con None.


Grazie ma sembra troppo complicato per le mie esigenze.
Jey,

Bello, ma un po 'eccessivo +1
Burhan Khalid

2
Panda è abbastanza sicuro che usa le librerie xlrd / xlwt per le sue eccellenti capacità pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey

6
Supponevo che lo usasse xlwtanche io , ma ho riscontrato un openpyxlerrore. Per chiunque sia confuso da questo - è tutto nel tipo di file che desideri. I documenti panda (0.12) dicono "I file con .xlsestensione saranno scritti usando xlwt e quelli con .xlsxestensione saranno scritti usando openpyxl".
Racing Tadpole,

5
Non so perché la gente stia dicendo che è eccessivo. Per i miei scopi era proprio quello che cercavo. Grazie!
Abe,

35
  • xlrd / xlwt (standard): Python non ha questa funzionalità nella sua libreria standard, ma penso a xlrd / xlwt come al modo "standard" di leggere e scrivere file Excel. È abbastanza facile creare una cartella di lavoro, aggiungere fogli, scrivere dati / formule e formattare celle. Se hai bisogno di tutte queste cose, potresti avere il massimo successo con questa libreria. Penso che potresti scegliere openpyxl invece e sarebbe abbastanza simile, ma non l'ho usato.

    Per formattare le celle con xlwt, definisci a XFStylee includi lo stile quando scrivi su un foglio. Ecco un esempio con molti formati numerici . Vedi il codice di esempio di seguito.

  • Tablib (potente, intuitivo): Tablib è una libreria più potente ma intuitiva per lavorare con i dati tabulari. Può scrivere cartelle di lavoro di Excel con più fogli e altri formati, come CSV, JSON e YAML. Se non hai bisogno di celle formattate (come il colore di sfondo), farai un favore a te stesso per usare questa libreria, che ti porterà più a lungo termine.

  • csv (facile): i file sul tuo computer sono di testo o binari . I file di testo sono solo caratteri, compresi quelli speciali come nuove righe e schede, e possono essere facilmente aperti ovunque (ad es. Blocco note, browser Web o prodotti Office). Un file CSV è un file di testo che è formattato in un certo modo: ogni riga è un elenco di valori, separati da virgole. I programmi Python possono facilmente leggere e scrivere testo, quindi un file CSV è il modo più semplice e veloce per esportare i dati dal tuo programma Python in Excel (o un altro programma Python).

    I file Excel sono binari e richiedono librerie speciali che conoscono il formato del file, motivo per cui hai bisogno di una libreria aggiuntiva per Python o di un programma speciale come Microsoft Excel, Gnumeric o LibreOffice, per leggerli / scriverli.


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
Probabilmente vuoi usare il modulo csv incluso nella libreria standard se stai per scrivere un file CSV.
Flimm,

1
Non che sia particolarmente importante, ma Tablib, come tanti altri pacchetti di livello superiore, usa xlwt per produrre file Excel.
John Y

13

Ho esaminato alcuni moduli Excel per Python e ho scoperto che openpyxl è il migliore.

Il libro gratuito Automate the Boring Stuff with Python ha un capitolo su openpyxl con maggiori dettagli oppure puoi consultare il sito Leggi i documenti . Non avrai bisogno di Office o Excel installati per usare openpyxl.

Il tuo programma sarebbe simile a questo:

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')

Viene visualizzato un errore che dice: impossibile convertire int64 in Excel
pnkjmndhl il

11

CSV sta per valori separati da virgola. CSV è come un file di testo e può essere creato semplicemente aggiungendo l' estensione .CSV

per esempio scrivi questo codice:

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

puoi aprire questo file con Excel.


5
Non è possibile formattare gli sfondi delle colonne utilizzando CSV. È solo un formato di dati per l'importazione e l'esportazione.
Michael Dillon,

5
Probabilmente vuoi usare il modulo csv incluso nella libreria standard se vuoi farlo. Gestisce meglio la quotazione, per esempio.
Flimm,

@Flimm come posso semplicemente scrivere su celle diverse?
Oldboy,

se stai usando Python 3 e il file contiene caratteri non ASCII, come éo , è meglio fare f.write('\xEF\xBB\xBF')subito dopo open(). Questa è la distinta base ( byte order mark , qv), necessaria al software Microsoft per riconoscere la codifica 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

Prova a dare un'occhiata anche alle seguenti librerie:

xlwings - per ottenere e estrarre dati da un foglio di calcolo da Python, oltre a manipolare cartelle di lavoro e grafici

ExcelPython - un componente aggiuntivo di Excel per la scrittura di funzioni definite dall'utente (UDF) e macro in Python anziché VBA


2

OpenPyxl è una libreria piuttosto carina, costruita per leggere / scrivere file xlsx / xlsm di Excel 2010:

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

L'altra risposta , riferendosi ad essa, sta usando la funzione deperciata ( get_sheet_by_name). Ecco come farlo senza di essa:

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
Il codice sopra produce erroreFileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Atinesh

@Atinesh - Grazie per il feedback - openpyxl.load_workbookcarica una cartella di lavoro, che è già presente. Crea un file New.xlsxper evitare questo errore.
Vityata,

1
OK Grazie per il suggerimento
Atinesh

Si noti che openpyxl non supporta il vecchio formato 'xls'.
Timothy C. Quinn,

2

La xlsxwriterlibreria è ottima per la creazione di .xlsxfile. Il frammento seguente genera un .xlsxfile da un elenco di dadi mentre indica l' ordine e i nomi visualizzati :

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)

inserisci qui la descrizione dell'immagine


💡 Nota 1 - Non sto volutamente rispondendo al caso esatto presentato dall'OP. Invece, sto presentando una soluzione più generica che IMHO cerca la maggior parte dei visitatori. Il titolo di questa domanda è ben indicizzato nei motori di ricerca e tiene traccia di molto traffico

inserisci qui la descrizione dell'immagine

💡 Nota 2 - Se non si utilizza Python3.6 o versioni successive, considerare l'utilizzo OrderedDictin headers. Prima di Python3.6 l'ordine dictnon era conservato.



0

Il modo più semplice per importare i numeri esatti è aggiungere un decimale dopo i numeri in l1e l2. Python interpreta questo punto decimale come istruzioni da te per includere il numero esatto. Se è necessario limitarlo a una cifra decimale, si dovrebbe essere in grado di creare un comando di stampa che limiti l'output, qualcosa di semplice come:

print variable_example[:13]

Lo limiterei al decimo decimale, supponendo che i tuoi dati abbiano due numeri interi decimali.


0

Puoi provare la libreria python orientata agli oggetti di hfexcel Human Friendly basata su 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

Se hai bisogno di modificare una cartella di lavoro esistente, il modo più sicuro sarebbe usare pyoo . Devi avere alcune librerie installate e ci vogliono alcuni cerchi per saltare, ma una volta impostato, questo sarebbe a prova di proiettile poiché stai sfruttando le API ampie e solide di LibreOffice / OpenOffice.

Si prega di vedere il mio Gist su come impostare un sistema Linux e fare un po 'di codifica di base usando pyoo.

Ecco un esempio del codice:

#!/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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.