2014-09-17 22 views
6

Attualmente sto usando xlwt con abbastanza successo per creare file .xls. Sto anche imparando xlsxwriter per possibili applicazioni future in cui avrò bisogno di alcune delle sue funzionalità.xlsxwriter e xlwt: scrivere una lista di stringhe su una cella

xlwt scrive agevolmente elenchi di stringhe nelle celle.

ad es.

import xlwt 
a = ['January\n','February\n','March\n','April\n','May\n','June\n'] 
book = xlwt.Workbook() 
sheet = book.add_sheet('Test') 
sheet.write(0,0,a) 
book.save('Test.xls') 

Aprire il file Test.xls, abilitare Testo a capo, e la cella A1 mostra:

January 
February 
March 
April 
May 
June 

ho cercato di fare qualcosa di simile con xlsxwriter

import xlsxwriter 
xbook = xlsxwriter.Workbook('Test.xlsx') 
xsheet = xbook.add_worksheet('Test') 
xsheet.write(0,0,a) 

Qui, ho un messaggio di errore lungo che termina in

...anaconda/lib/python2.7/site-packages/xlsxwriter/worksheet.pyc in write(self, row, col, *args) 
    416   # We haven't matched a supported type. Try float. 
    417   try: 
--> 418    f = float(token) 
    419    if not self._isnan(f) and not self._isinf(f): 
    420     return self.write_number(row, col, f, *args[1:]) 

TypeError: float() argument must be a string or a number 

Ho provato altri metodi di scrittura xlsxwriter e tutti danno errori simili.

Altre ricerche: ho cercato questo sito abbastanza accuratamente. Ho anche passato l'eccellente xlsxwriter PDF e controllato le pagine di Github di xlsxwriter. Finora, non ho trovato nulla che indirizzi questo.

Ancora una volta, xlwt va bene per ora mi aspetto di dover aggiungere grafici e grafici sparkline, nonché per creare file xlsx nel prossimo futuro.

Grazie,

il vecchio nel club

+1

Basta usare ' "" .join (a) 'invece di' a' se 'isinstance (a, list) == True'. –

+0

Questo è esattamente ciò di cui ho bisogno. Non riesco ad accettare la risposta in quanto non esiste una casella di controllo ... – OldGuyInTheClub

risposta

2

No, non è possibile scrivere un tipo list utilizzando xlsxwrite.write().

Controllare il docs

Se nessuno dei tipi sopra sono abbinati il ​​valore viene valutata con galleggiante() per vedere se corrisponde a un utente definito tipo float. Se è , allora è scritto usando write_number().

Questo è il motivo per cui si ottiene l'errore TypeError: float() argument must be a string or a number

Per risolvere questo problema provare la conversione del list ad un string, come suggerito da Paulo Scardine (nei commenti):

import xlsxwriter 
a = ['January\n','February\n','March\n','April\n','May\n','June\n'] 
xbook = xlsxwriter.Workbook('Test.xlsx') 
xsheet = xbook.add_worksheet('Test') 
xsheet.write(0,0,''.join(a)) 
3

Il metodo write() in XlsxWriter non supporta gli elenchi.

È possibile scrivere le liste utilizzando il foglio di lavoro write_row() metodo:

import xlsxwriter 

a = ['January\n','February\n','March\n','April\n','May\n','June\n'] 

xbook = xlsxwriter.Workbook('Test.xlsx') 
xsheet = xbook.add_worksheet('Test') 

xsheet.write_row(0, 0, a) 

xbook.close() 

P.S. Questa eccezione non è molto utile in questo caso e verrà risolta nella prossima versione.Ecco l'eccezione dal vostro programma di esempio utilizzando la versione di XlsxWriter su GitHub:

TypeError: Unsupported type <type 'list'> in write() 
+0

L'ho provato come parte dei miei primi esperimenti con ciascuno dei metodi write_. Questo posizionava ogni elemento dell'elenco in una cella separata (come previsto dai documenti). Il metodo "" .join mette tutte le stringhe in una cella che è qualcosa che devo fare per un'applicazione corrente. Spero che non sia una cattiva forma riconoscere i tuoi sforzi nella creazione di questo pacchetto. – OldGuyInTheClub

+0

Whoops, mi dispiace. Ho perso il fatto che tu li volessi tutti in una cella. In tal caso il 'join()' mostrato sopra è un'opzione migliore. – jmcnamara

+0

In tal caso potrebbe essere necessario anche il formato [wrap_text] (https://xlsxwriter.readthedocs.org/format.html?#format-set-text-wrap). E no, non era una cattiva forma. :-) – jmcnamara

2

Ho lavorato con un problema simile.

stato in grado di ottenere il risultato desiderato utilizzando enumerare per ottenere l'indice di ogni stringa nella lista e poi passaggio che sia come il riferimento Row e il dato di .WRITE:

import xlsxwriter 

a = ['January\n','February\n','March\n','April\n','May\n','June\n'] 

xbook = xlsxwriter.Workbook('Test.xlsx') 
xsheet = xbook.add_worksheet('Test') 

for idx, month in enumerate(a): 
    xsheet.write(idx,0,a[idx]) 

xbook.close()