Escribir en una hoja de cálculo de Excel


149

Soy nuevo en Python. Necesito escribir algunos datos de mi programa en una hoja de cálculo. He buscado en línea y parece que hay muchos paquetes disponibles (xlwt, XlsXcessive, openpyxl). Otros sugieren escribir en un archivo .csv (nunca usé CSV y realmente no entiendo de qué se trata).

El programa es muy simple. Tengo dos listas (flotante) y tres variables (cadenas). No sé la longitud de las dos listas y probablemente no tendrán la misma longitud.

Quiero que el diseño sea como en la imagen a continuación:

Muestra de diseño

La columna rosa tendrá los valores de la primera lista y la columna verde tendrá los valores de la segunda lista.

Entonces, ¿cuál es la mejor manera de hacer esto?

PD: Estoy ejecutando Windows 7 pero no necesariamente tendré Office instalado en las computadoras que ejecutan este programa.

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

Escribí esto usando todas sus sugerencias. Hace el trabajo pero puede mejorarse ligeramente.

¿Cómo formateo las celdas creadas en el bucle for (valores list1) como científicas o numéricas?

No quiero truncar los valores. Los valores reales utilizados en el programa tendrían alrededor de 10 dígitos después del decimal.


Comprenderá qué es un archivo tsv si lo abre en un editor de texto como el bloc de notas / wordpad. La ventaja clave de usar tsv es que puede estar seguro de que básicamente cualquier versión de cualquier programa de hoja de cálculo puede abrirlo, y no solo el sobresaliente de Office 2010
goncalopp

Utilice el formato de cadena en python para controlar la visualización de los datos numéricos.
Fred Mitchell

verifique openpyxl para trabajar con archivos .xlsx
Santiago

Respuestas:


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)

Para más explicaciones: https://github.com/python-excel


13
Es posible que desee mencionar que si está ejecutando Python en Windows y tiene Excel instalado en la misma máquina, puede usar la interfaz COM de Python para controlar directamente Excel.
Michael Dillon el

1
El enlace fue muy útil. Gracias
Jey

3
Sólo nota que con este límite máximo de fila es el código 65536 filas, como archivos .xls sólo admiten que muchas filas
Shreyas Pimpalgaonkar

1
Para ser claros, xlwtes solo para escribir los .xlsarchivos antiguos para Excel 2003 o anterior. Esto puede estar desactualizado (dependiendo de sus necesidades).
Cowlinator

Puede verificar openpyxl para trabajar con archivos .xlsx
Santiago

140

Use DataFrame.to_excel de pandas . Pandas le permite representar sus datos en estructuras de datos funcionalmente ricas y también le permitirá leer en archivos de Excel.

Primero tendrá que convertir sus datos en un DataFrame y luego guardarlos en un archivo de Excel de esta manera:

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)

y el archivo de Excel que sale se ve así:

ingrese la descripción de la imagen aquí

Tenga en cuenta que ambas listas deben tener la misma longitud; de lo contrario, los pandas se quejarán. Para resolver esto, reemplace todos los valores faltantes con None.


Gracias pero parece demasiado complicado para mis necesidades.
Jey

Bonito, pero un poco exagerado +1
Burhan Khalid

2
Bastante seguro de que pandas usa las bibliotecas xlrd / xlwt por sus capacidades de Excel pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey

66
Supuse que xlwttambién se usaba , pero recibí un openpyxlerror. Para cualquier otra persona que se confunda con esto, todo está en el tipo de archivo que desea. Los documentos de pandas (0.12) dicen "Los archivos con una .xlsextensión se escribirán usando xlwt y aquellos con una .xlsxextensión se escribirán usando openpyxl".
Racing Tadpole

55
No estoy seguro de por qué la gente dice que es excesivo. Para mis propósitos, era justo lo que estaba buscando. ¡Gracias!
Abe

35
  • xlrd / xlwt (estándar): Python no tiene esta funcionalidad en su biblioteca estándar, pero creo que xlrd / xlwt es la forma "estándar" de leer y escribir archivos de Excel. Es bastante fácil hacer un libro de trabajo, agregar hojas, escribir datos / fórmulas y formatear celdas. Si necesita todas estas cosas, puede tener el mayor éxito con esta biblioteca. Creo que podrías elegir openpyxl y sería bastante similar, pero no lo he usado.

    Para formatear celdas con xlwt, defina ay XFStyleincluya el estilo cuando escriba en una hoja. Aquí hay un ejemplo con muchos formatos de números . Vea el código de ejemplo a continuación.

  • Tablib (potente, intuitivo): Tablib es una biblioteca más potente pero intuitiva para trabajar con datos tabulares. Puede escribir libros de Excel con varias hojas, así como otros formatos, como csv, json y yaml. Si no necesita celdas formateadas (como el color de fondo), se hará un favor para usar esta biblioteca, que lo llevará más lejos a la larga.

  • csv (fácil): los archivos en su computadora son de texto o binarios . Los archivos de texto son solo caracteres, incluidos los especiales, como las nuevas líneas y las pestañas, y se pueden abrir fácilmente en cualquier lugar (por ejemplo, el bloc de notas, el navegador web o los productos de Office). Un archivo csv es un archivo de texto que está formateado de cierta manera: cada línea es una lista de valores, separados por comas. Los programas de Python pueden leer y escribir texto fácilmente, por lo que un archivo csv es la forma más fácil y rápida de exportar datos de su programa de Python a Excel (u otro programa de Python).

    Los archivos de Excel son binarios y requieren bibliotecas especiales que conocen el formato del archivo, por lo que necesita una biblioteca adicional para python, o un programa especial como Microsoft Excel, Gnumeric o LibreOffice, para leerlos / escribirlos.


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
Probablemente quiera usar el módulo csv incluido en la biblioteca estándar si va a escribir un archivo CSV.
Flimm

1
No es que importe particularmente, pero Tablib, como tantos otros paquetes de nivel superior, usa xlwt para generar archivos de Excel.
John Y

13

Estudié algunos módulos de Excel para Python, y descubrí que openpyxl es el mejor.

El libro gratuito Automate the Boring Stuff with Python tiene un capítulo sobre openpyxl con más detalles o puede consultar el sitio Lea los documentos . No necesitará Office o Excel instalado para usar openpyxl.

Su programa se vería así:

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

Me sale un error que dice: no se puede convertir int64 a Excel
pnkjmndhl

11

CSV significa valores separados por comas. CSV es como un archivo de texto y se puede crear simplemente agregando la extensión .CSV

por ejemplo escriba este código:

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

Puedes abrir este archivo con Excel.


55
No puede formatear los fondos de columna usando CSV. Es solo un formato de datos para importar y exportar.
Michael Dillon el

55
Probablemente quiera usar el módulo csv incluido en la biblioteca estándar si va a hacer esto. Maneja las citas mejor, por ejemplo.
Flimm

@Flimm, ¿cómo escribo simplemente en diferentes celdas?
oldboy

si está utilizando Python 3 y el archivo contiene caracteres que no son ASCII, como éo , es mejor que lo haga f.write('\xEF\xBB\xBF')justo después de open(). Esa es la lista de materiales ( byte order mark , qv), necesaria para que el software de Microsoft reconozca la codificación 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

Intente echar un vistazo a las siguientes bibliotecas también:

xlwings : para introducir y extraer datos de una hoja de cálculo desde Python, así como para manipular libros y gráficos

ExcelPython : un complemento de Excel para escribir funciones definidas por el usuario (UDF) y macros en Python en lugar de VBA


2

OpenPyxl es una biblioteca bastante buena, construida para leer / escribir archivos Excel 2010 xlsx / xlsm:

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

La otra respuesta , refiriéndose a ella, es usar la función desproporcionada ( get_sheet_by_name). Así es como hacerlo sin él:

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
El código anterior produce un errorFileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Atinesh

@Atinesh - Gracias por los comentarios - openpyxl.load_workbookcarga un libro de trabajo, que ya está presente. Crea un archivo New.xlsxpara evitar este error.
Vityata

1
OK Gracias por la sugerencia
Atinesh

Tenga en cuenta que openpyxl no es compatible con el formato anterior 'xls'.
Timothy C. Quinn

2

La xlsxwriterbiblioteca es excelente para crear .xlsxarchivos. El siguiente fragmento genera un .xlsxarchivo a partir de una lista de dictados mientras indica el orden y los nombres que se muestran :

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)

ingrese la descripción de la imagen aquí


💡 Nota 1 - No estoy respondiendo a propósito al caso exacto que presentó el OP. En cambio, estoy presentando una solución más genérica en mi humilde opinión la mayoría de los visitantes buscan. El título de esta pregunta está bien indexado en los motores de búsqueda y rastrea mucho tráfico

ingrese la descripción de la imagen aquí

💡 Nota 2 - Si va a no utilizar Python3.6 o más nuevo, considere el uso OrderedDictde headers. Antes de Python3.6, el pedido dictno se conservaba.



0

La forma más fácil de importar los números exactos es agregar un decimal después de los números en su l1y l2. Python interpreta este punto decimal como instrucciones de usted para incluir el número exacto. Si necesita restringirlo a un lugar decimal, debería poder crear un comando de impresión que limite la salida, algo simple como:

print variable_example[:13]

Lo restringiría al décimo lugar decimal, suponiendo que sus datos tengan dos enteros a la izquierda del decimal.


0

Puede probar la biblioteca de python orientada a objetos hfexcel Human Friendly basada en 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 su necesidad es modificar un libro de trabajo existente, la forma más segura sería usar pyoo . Necesita tener algunas bibliotecas instaladas y se necesitan algunos aros para saltar, pero una vez que esté configurado, esto sería a prueba de balas, ya que está aprovechando las API amplias y sólidas de LibreOffice / OpenOffice.

Consulte mi Gist sobre cómo configurar un sistema Linux y hacer una codificación básica con pyoo.

Aquí hay un ejemplo del código:

#!/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()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.