Gravando em uma planilha do Excel


149

Eu sou novo no Python. Preciso gravar alguns dados do meu programa em uma planilha. Pesquisei on-line e parece haver muitos pacotes disponíveis (xlwt, XlsXcessive, openpyxl). Outros sugerem gravar em um arquivo .csv (nunca usou CSV e realmente não entende o que é).

O programa é muito simples. Eu tenho duas listas (float) e três variáveis ​​(strings). Não sei os comprimentos das duas listas e provavelmente não terão o mesmo comprimento.

Quero que o layout seja como na figura abaixo:

Amostra de layout

A coluna rosa terá os valores da primeira lista e a coluna verde terá os valores da segunda lista.

Então, qual é a melhor maneira de fazer isso?

PS Estou executando o Windows 7, mas não necessariamente tenho o Office instalado nos computadores executando 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")

Eu escrevi isso usando todas as suas sugestões. Ele faz o trabalho, mas pode ser ligeiramente aprimorado.

Como formatar as células criadas no loop for (valores da lista1) como científicas ou numéricas?

Não quero truncar os valores. Os valores reais usados ​​no programa teriam cerca de 10 dígitos após o decimal.


Você entenderá o que é um arquivo tsv se você o abrir em um editor de texto como o bloco de notas / wordpad. A principal vantagem de usar TSV é que você pode ter certeza que, basicamente, qualquer versão de qualquer programa de planilha pode abri-lo, e não apenas o Office 2010 do excel
— goncalopp

Use o formato de string em python para controlar a exibição dos dados numéricos.
— Fred Mitchell

verifique o openpyxl para trabalhar com arquivos .xlsx
— Santiago

Respostas:


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 mais explicações: https://github.com/python-excel


13
Você pode mencionar que, se estiver executando o Python no Windows e tiver o Excel instalado na mesma máquina, poderá usar a interface COM do Python para controlar diretamente o Excel.
— Michael Dillon

1
O link foi muito útil. Obrigado
— Jey

3
Nota só que com este limite de código de linha máxima é de 65536 linhas, como arquivos .xls apoiar somente essas linhas
— Shreyas Pimpalgaonkar

1
Para ser claro, xlwté apenas para gravar os .xlsarquivos antigos do Excel 2003 ou anterior. Isso pode estar desatualizado (dependendo de suas necessidades).
— cowlinator

Você pode verificar o openpyxl para trabalhar com arquivos .xlsx
— Santiago

140

Use DataFrame.to_excel dos pandas . O Pandas permite que você represente seus dados em estruturas de dados funcionalmente ricas e também permite ler em arquivos do Excel.

Você primeiro terá que converter seus dados em um DataFrame e, em seguida, salvá-los em um arquivo do Excel, assim:

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 o arquivo do Excel que aparece é assim:

insira a descrição da imagem aqui

Observe que ambas as listas precisam ter o mesmo comprimento, caso contrário os pandas irão reclamar. Para resolver isso, substitua todos os valores ausentes por None.


Obrigado, mas parece muito complicado para as minhas necessidades.
— Jey

Bom, mas um pouco exagerado +1
— Burhan Khalid

2
Certeza que pandas usa o xlrd / xlwt bibliotecas por suas capacidades de excel pandas.pydata.org/pandas-docs/stable/io.html#excel-files
— mrmagooey

6
Eu estava assumindo que xlwttambém era usado , mas obtendo um openpyxlerro. Para qualquer pessoa que fique confusa com isso - está tudo no tipo de arquivo que você deseja. Os documentos do pandas (0.12) dizem "Arquivos com uma .xlsextensão serão gravados usando xlwt e aqueles com uma .xlsxextensão serão gravados usando openpyxl".
— Racing Tadpole

5
Não sei por que as pessoas estão dizendo que é um exagero. Para meus propósitos, era exatamente o que eu estava procurando. Obrigado!
— Abe

35
  • xlrd / xlwt (padrão): O Python não possui essa funcionalidade em sua biblioteca padrão, mas penso no xlrd / xlwt como a maneira "padrão" de ler e gravar arquivos do Excel. É bastante fácil criar uma pasta de trabalho, adicionar folhas, escrever dados / fórmulas e formatar células. Se você precisar de todas essas coisas, poderá ter mais sucesso com esta biblioteca. Eu acho que você poderia escolher o openpyxl e seria bem parecido, mas eu não o usei.

    Para formatar células com xlwt, defina a XFStylee inclua o estilo ao gravar em uma planilha. Aqui está um exemplo com muitos formatos numéricos . Veja o código de exemplo abaixo.

  • Tablib (poderoso, intuitivo): O Tablib é uma biblioteca mais poderosa e intuitiva para trabalhar com dados tabulares. Ele pode escrever pastas de trabalho do Excel com várias planilhas, além de outros formatos, como csv, json e yaml. Se você não precisar de células formatadas (como a cor de fundo), faça um favor a si mesmo para usar esta biblioteca, o que o levará mais longe a longo prazo.

  • csv (fácil): os arquivos no seu computador são de texto ou binários . Arquivos de texto são apenas caracteres, incluindo caracteres especiais como novas linhas e guias, e podem ser facilmente abertos em qualquer lugar (por exemplo, bloco de notas, navegador da Web ou produtos do Office). Um arquivo csv é um arquivo de texto formatado de uma certa maneira: cada linha é uma lista de valores, separados por vírgulas. Os programas Python podem ler e escrever texto com facilidade, portanto, um arquivo csv é a maneira mais fácil e rápida de exportar dados do seu programa python para o excel (ou outro programa python).

    Os arquivos do Excel são binários e exigem bibliotecas especiais que conhecem o formato do arquivo, e é por isso que você precisa de uma biblioteca adicional para python ou de um programa especial como o Microsoft Excel, Gnumeric ou LibreOffice para lê-los / gravá-los.


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
Você provavelmente deseja usar o módulo csv incluído na biblioteca padrão se quiser gravar um arquivo CSV.
— Flimm

1
Não que isso seja particularmente importante, mas o Tablib, como muitos outros pacotes de nível superior, usa o xlwt para gerar arquivos do Excel.
— John Y

13

Pesquisei alguns módulos do Excel para Python e achei o openpyxl o melhor.

O livro gratuito Automatize as coisas chatas com Python tem um capítulo sobre o openpyxl com mais detalhes ou você pode conferir o site Leia os documentos . Você não precisará do Office ou Excel instalado para usar o openpyxl.

Seu programa seria algo parecido com isto:

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

Eu recebo um erro dizendo: não é possível converter int64 para o Excel
— pnkjmndhl

11

CSV significa valores separados por vírgula. O CSV é como um arquivo de texto e pode ser criado simplesmente adicionando a extensão .CSV

por exemplo, escreva este código:

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

você pode abrir este arquivo com o excel.


5
Você não pode formatar os fundos da coluna usando CSV. É apenas um formato de dados para importação e exportação.
— Michael Dillon

5
Você provavelmente deseja usar o módulo csv incluído na biblioteca padrão se quiser fazer isso. Ele lida melhor com a citação, por exemplo.
— Flimm

@Limlim como simplesmente escrever para células diferentes?
— Oldboy

se você estiver usando Python 3 e o arquivo contiver caracteres não ASCII, como éou 中, é melhor fazer um f.write('\xEF\xBB\xBF')logo após o open(). Essa é a lista técnica ( byte order mark , qv), necessária pelo software da Microsoft para reconhecer a codificação 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

Tente também dar uma olhada nas seguintes bibliotecas:

xlwings - para obter e obter dados de uma planilha do Python, além de manipular pastas de trabalho e gráficos

ExcelPython - um suplemento do Excel para escrever UDFs (funções definidas pelo usuário) e macros em Python, em vez de VBA


2

OpenPyxl é uma biblioteca bastante boa, criada para ler / gravar arquivos xlsx / xlsm do Excel 2010:

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

A outra resposta , referindo-se a ela, está usando a função adiada ( get_sheet_by_name). É assim que se faz sem ele:

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
O código acima produz erro #FileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
— 19418 Atinesh

@Atinesh - Obrigado pelo feedback - openpyxl.load_workbookcarrega uma pasta de trabalho, que já está presente. Crie um arquivo New.xlsxpara evitar esse erro.
— Vityata

1
OK Obrigado pela sugestão
— Atinesh

Observe que o openpyxl não suporta o formato 'xls' mais antigo.
— Timothy C. Quinn

2

A xlsxwriterbiblioteca é ótima para criar .xlsxarquivos. O fragmento a seguir gera um .xlsxarquivo a partir de uma lista de dictos ao declarar a ordem e os nomes exibidos :

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)

insira a descrição da imagem aqui


1 Nota 1 - Eu propositalmente não estou respondendo ao caso exato que o OP apresentou. Em vez disso, estou apresentando uma solução mais genérica que IMHO a maioria dos visitantes procura. O título desta pergunta está bem indexado nos mecanismos de pesquisa e acompanha muito tráfego

insira a descrição da imagem aqui

2 Nota 2 - Se você não estiver usando o Python3.6 ou mais recente, considere usar o OrderedDictin headers. Antes do Python3.6, o pedido dictnão era preservado.



0

A maneira mais fácil de importar os números exatos é adicionar um decimal após os números no seu l1e l2. Python interpreta esse ponto decimal como instruções suas para incluir o número exato. Se precisar restringi-lo a alguma casa decimal, você poderá criar um comando de impressão que limite a saída, algo simples como:

print variable_example[:13]

Restringiria à décima casa decimal, supondo que seus dados tenham dois números inteiros à esquerda da casa decimal.


0

Você pode tentar a biblioteca python orientada a objetos hfexcel amigável para humanos com base no 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 você precisar modificar uma pasta de trabalho existente, a maneira mais segura seria usar o pyoo . Você precisa ter algumas bibliotecas instaladas e são necessárias algumas etapas, mas uma vez configuradas, isso seria à prova de balas, pois você está aproveitando as APIs amplas e sólidas do LibreOffice / OpenOffice.

Por favor, veja meu Gist sobre como configurar um sistema Linux e fazer algumas codificações básicas usando pyoo.

Aqui está um exemplo do 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()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.