2013-05-17 4 views
5

Devo scrivere un enorme file Excel e lo optimized writer in openpyxl è quello di cui ho bisogno.Imposta il formato e lo stile della cella utilizzando Optimized Writer in openpyxl

La domanda è: è possibile impostare lo stile e il formato delle celle quando si utilizza lo scrittore ottimizzato? Lo stile non è così importante (vorrei solo evidenziare le intestazioni delle colonne), ma ho bisogno del formato numerico corretto per alcune colonne che contengono valori di valuta. Ho visto che il metodo ws.cell() non è disponibile quando si utilizza il writer ottimizzato, quindi come farlo?

Grazie in anticipo per il vostro aiuto!

risposta

4

Si potrebbe anche guardare il modulo XlsxWriter che consente di scrivere file enormi in optimised mode con formatting.

from xlsxwriter.workbook import Workbook 

workbook = Workbook('file.xlsx', {'constant_memory': True}) 
worksheet = workbook.add_worksheet() 
... 
+0

Grazie per un modulo così fantastico! Ci sono dei benchmark delle prestazioni openpyxl con 'optimize_write = True' vs xlsxwriter con' constant_memory = True'? – alecxe

+0

I ragazzi [PyExcelerate] (https://github.com/whitehat2k9/PyExcelerate) hanno un benchmark nel loro [README] (https://github.com/whitehat2k9/PyExcelerate/blob/master/README.md) per PyExcelerate , XlsxWriter e OpenPyXL. – jmcnamara

+0

Grazie per aver condiviso. Pyexcelerate sembra promettente in termini di velocità, ma nient'altro: nessuna formattazione della cella, impostazione della pagina ecc. Spero che xlsxwriter sarà più veloce nelle versioni future. – alecxe

1

Citazione di documenti:

Coloro foglio hanno solo un metodo append(), non è possibile accedere cellule indipendenti direttamente (attraverso la cella() o intervallo()). Loro sono di sola scrittura.

Quando si passa optimized_write=True al costruttore Workbook, openpyxl utilizzerà DumpWorksheet classe invece di Worksheet. La classe DumpWorksheet è molto limitata in termini di stile e formattazione.

Ma, guarda il metodo append - corrisponde al tipo di dati Python che si passano ai tipi di Excel. Quindi, vedere i formati delle celle corrette nel file risultato dopo l'esecuzione di questo:

import datetime 
from openpyxl import Workbook 

wb = Workbook(optimized_write=True) 
ws = wb.create_sheet() 

for irow in xrange(5): 
    ws.append([True, datetime.datetime.now(), 'test', 1, 1.25, '=D1+E1']) 

wb.save('output.xlsx') 

Parlando di cambiare la colonna intestazioni stile - proprio nessun modo per farlo utilizzando scrittore ottimizzato.

Spero che questo aiuti.

1

È possibile utilizzare WriteOnlyCell per eseguire questa operazione.

from openpyxl import Workbook 
wb = Workbook(optimized_write = True) 
ws = wb.create_sheet() 
from openpyxl.writer.dump_worksheet import WriteOnlyCell 
from openpyxl.styles import Style, Font, PatternFill 
cell = WriteOnlyCell(ws, value="highlight") 
cell.style = Style(font=Font(name='Courier', size=36), fill=PatternFill(fill_type='solid',start_color='8557e5')) 
cols=[] 
cols.append(cell) 
cols.append("some other value") 
ws.append(cols) 
wb.save("test.xlsx") 

Spero che questo aiuti. Puoi usare tutto ciò che lo stile permetterà prima di aggiungerlo alla riga per il foglio di lavoro.

2

Come non posso commentare, vi posterò un aggiornamento per la risposta di Dean qui:

API openpyxl (versione 2.4.7) è leggermente cambiata in modo che ora dovrebbe leggere:

from openpyxl import Workbook 
wb = Workbook(write_only = True) 
ws = wb.create_sheet() 

from openpyxl.writer.dump_worksheet import WriteOnlyCell 
from openpyxl.styles import Font 

cell = WriteOnlyCell(ws, value="highlight") 
cell.font = Font(name='Courier', size=36) 

cols=[] 
cols.append(cell) 
cols.append("some other value") 
ws.append(cols) 
wb.save("test.xlsx") 

Hope it helps