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.

Jey
fonte
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

thkang
fonte
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.

diliop
fonte
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)
jmilloy
fonte
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')
Al Sweigart
fonte
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.

2 8
fonte
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()
Naveen Agarwal
fonte
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

ehremo
fonte
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
Vityata
fonte
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.


Jossef Harush
fonte
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.

Kyle Cyree
fonte
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()
Emin Bugra Saral
fonte
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()
Timothy C. Quinn
fonte