Запись в электронную таблицу Excel


149

Я новичок в Python. Мне нужно записать некоторые данные из моей программы в электронную таблицу. Я искал в Интернете, и, кажется, есть много доступных пакетов (xlwt, XlsXcessive, openpyxl). Другие предлагают записать в файл .csv (никогда не использовал CSV и не совсем понимали, что это такое).

Программа очень проста. У меня есть два списка (float) и три переменные (строки). Я не знаю длины двух списков, и они, вероятно, не будут одинаковой длины.

Я хочу, чтобы макет был таким, как на картинке ниже:

Образец макета

Розовый столбец будет иметь значения первого списка, а зеленый столбец будет иметь значения второго списка.

Так каков лучший способ сделать это?

PS Я использую Windows 7, но у меня не обязательно будет установлен Office на компьютерах с этой программой.

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

Я написал это, используя все ваши предложения. Он выполняет свою работу, но его можно немного улучшить.

Как отформатировать ячейки, созданные в цикле for (значения list1), как научные или числовые?

Я не хочу усекать значения. Фактические значения, используемые в программе, будут иметь около 10 цифр после десятичной дроби.


Вы поймете, что такое файл tsv, если откроете его в текстовом редакторе, таком как блокнот / wordpad. Основное преимущество использования tsv заключается в том, что вы можете быть уверены, что открыть его может любая версия любой программы для работы с электронными таблицами, а не только Excel 2010
goncalopp

Используйте строковый формат в Python для управления отображением числовых данных.
Фред Митчелл

проверить openpyxl для работы с файлами .xlsx
Сантьяго

Ответы:


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)

для более подробного объяснения: https://github.com/python-excel


13
Возможно, вы захотите упомянуть, что если вы используете Python в Windows и на этом компьютере установлен Excel, вы можете использовать интерфейс Python COM для прямого управления Excel.
Майкл Диллон

1
Ссылка была очень полезной. Спасибо
Jey

3
Просто отметьте, что с этим кодом максимальный предел строки составляет 65536 строк, поскольку файлы .xls поддерживают только такое количество строк
Shreyas Pimpalgaonkar

1
Чтобы было понятно, xlwtэто только для написания старых .xlsфайлов для Excel 2003 или более ранних версий. Это может быть устаревшим (в зависимости от ваших потребностей).
Cowlinator

Вы можете проверить openpyxl для работы с файлами .xlsx
Сантьяго

140

Используйте DataFrame.to_excel от панд . Pandas позволяет вам представлять ваши данные в функционально богатых структурах данных, а также позволяет читать в файлах Excel.

Сначала вам нужно будет преобразовать ваши данные в DataFrame, а затем сохранить их в файл Excel следующим образом:

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)

и файл Excel, который выходит, выглядит так:

введите описание изображения здесь

Обратите внимание, что оба списка должны быть одинаковой длины, иначе панды будут жаловаться. Чтобы решить эту проблему, замените все пропущенные значения на None.


Спасибо, но кажется слишком сложным для моих нужд.
Jey

Хороший, но немного излишний +1
Бурхан Халид

2
Уверен, что pandas использует библиотеки xlrd / xlwt для своих превосходных возможностей pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey

6
Я предполагал, что это использовало xlwtтакже, но получая openpyxlошибку. Для всех, кого это смущает - все это в нужном вам типе файла. Документы pandas (0.12) говорят: «Файлы с .xlsрасширением будут записываться с использованием xlwt, а файлы с .xlsxрасширением - с использованием openpyxl».
Гонки Головастик

5
Не уверен, почему люди говорят, что это излишне. Для моих целей это было именно то, что я искал. Спасибо!
Абэ

35
  • xlrd / xlwt (стандартный): Python не имеет этой функциональности в своей стандартной библиотеке, но я думаю о xlrd / xlwt как о «стандартном» способе чтения и записи файлов Excel. Довольно легко создать рабочую книгу, добавить листы, записать данные / формулы и отформатировать ячейки. Если вам нужны все эти вещи, вы можете добиться наибольшего успеха с этой библиотекой. Я думаю, что вы могли бы вместо этого выбрать openpyxl, и это было бы очень похоже, но я не использовал его.

    Чтобы отформатировать ячейки с помощью xlwt, определите XFStyleи включите стиль при записи на лист. Вот пример со многими числовыми форматами . Смотрите пример кода ниже.

  • Tablib (мощный, интуитивно понятный): Tablib - более мощная, но интуитивно понятная библиотека для работы с табличными данными. Он может создавать книги Excel с несколькими листами, а также в других форматах, таких как CSV, JSON и YAML. Если вам не нужны отформатированные ячейки (например, цвет фона), вы сделаете себе одолжение, чтобы использовать эту библиотеку, которая продвинет вас дальше.

  • CSV (легкий): файлы на вашем компьютере являются текстовыми или двоичными . Текстовые файлы - это просто символы, в том числе специальные, такие как переводы строк и табуляции, и их можно легко открыть где угодно (например, блокнот, веб-браузер или продукты Office). CSV-файл - это текстовый файл, который отформатирован определенным образом: каждая строка представляет собой список значений, разделенных запятыми. Программы Python могут легко читать и писать текст, поэтому CSV-файл - это самый простой и быстрый способ экспорта данных из вашей программы Python в Excel (или другую программу Python).

    Файлы Excel являются двоичными и требуют специальных библиотек, которые знают формат файла, поэтому для чтения / записи вам нужна дополнительная библиотека для python или специальная программа, такая как Microsoft Excel, Gnumeric или LibreOffice.


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
Возможно, вы захотите использовать модуль csv, включенный в стандартную библиотеку, если вы собираетесь писать файл CSV.
Flimm

1
Не то чтобы это особенно важно, но Tablib, как и многие другие высокоуровневые пакеты, использует xlwt для вывода файлов Excel.
Джон Y

13

Я рассмотрел несколько модулей Excel для Python и обнаружил, что openpyxl является лучшим.

В бесплатной книге Automate the Boring Stuff with Python есть глава об openpyxl с более подробной информацией, или вы можете проверить сайт Read the Docs . Вам не нужно будет устанавливать Office или Excel, чтобы использовать openpyxl.

Ваша программа будет выглядеть примерно так:

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

Я получаю сообщение об ошибке: невозможно преобразовать int64 в excel
pnkjmndhl

11

CSV обозначает значения, разделенные запятыми. CSV похож на текстовый файл и может быть создан простым добавлением расширения .CSV

например напишите этот код:

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

Вы можете открыть этот файл с Excel.


5
Вы не можете отформатировать фон столбца с помощью CSV. Это только формат данных для импорта и экспорта.
Майкл Диллон

5
Возможно, вы захотите использовать модуль csv, включенный в стандартную библиотеку, если вы собираетесь это сделать. Например, он лучше обрабатывает цитирование.
Flimm

@Flimm как мне просто писать в разные ячейки?
старик

если вы используете Python 3 и файл содержит символы, не входящие в ASCII, например, éили , лучше сделать это f.write('\xEF\xBB\xBF')сразу после open(). Это спецификация ( метка порядка байтов , qv), необходимая программному обеспечению Microsoft для распознавания кодировки UTF-8
Уолтер Тросс

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

Попробуйте взглянуть и на следующие библиотеки:

xlwings - для получения данных в и из электронной таблицы из Python, а также для работы с книгами и диаграммами

ExcelPython - надстройка Excel для написания пользовательских функций (UDF) и макросов в Python вместо VBA


2

OpenPyxl довольно хорошая библиотека, созданная для чтения / записи файлов Excel 2010 xlsx / xlsm:

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

Другой ответ , ссылаясь на это, использует deperciated функцию ( get_sheet_by_name). Вот как это сделать без него:

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
FileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Приведенный

@Atinesh - Спасибо за отзыв - openpyxl.load_workbookзагружает рабочую книгу, которая уже присутствует. Создайте файл, New.xlsxчтобы избежать этой ошибки.
Витя

1
ОК Спасибо за предложение
Атинеш

Обратите внимание, что openpyxl не поддерживает старый формат 'xls'.
Тимоти К. Куинн

2

xlsxwriterБиблиотека отлично подходит для создания .xlsxфайлов. Следующий фрагмент кода генерирует .xlsxфайл из списка диктов при указании порядка и отображаемых имен :

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)

введите описание изображения здесь


💡 Примечание 1 - Я намеренно не отвечаю на конкретный случай, представленный ОП. Вместо этого я представляю более общее решение, которое ИМХО ищет большинство посетителей. Заголовок этого вопроса хорошо проиндексирован в поисковых системах и отслеживает много трафика

введите описание изображения здесь

2 Примечание 2 - Если вы не используете Python3.6 или новее, рассмотрите возможность использования OrderedDictin headers. До Python3.6 порядок в dictне сохранялся.



0

Самый простой способ импортировать точные числа - это добавить десятичную дробь после цифр в вашем l1и l2. Python интерпретирует эту десятичную точку как инструкции от вас, чтобы включить точное число. Если вам нужно ограничить его до некоторого десятичного знака, вы сможете создать команду печати, которая ограничивает вывод, что-то простое, например:

print variable_example[:13]

Ограничил бы это до десятого знака после запятой, предполагая, что ваши данные имеют два целых числа слева от десятичного знака.


0

Вы можете попробовать hfexcel Human Friendly объектно-ориентированную библиотеку Python на основе 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

Если вам нужно изменить существующую книгу, самый безопасный способ - использовать pyoo . Вам нужно установить несколько библиотек, и вам потребуется несколько обручей для перехода, но после их настройки это будет пуленепробиваемым, поскольку вы используете широкий и надежный API LibreOffice / OpenOffice.

Пожалуйста, ознакомьтесь с моей статьей о том, как настроить систему linux и выполнить базовое кодирование с использованием pyoo.

Вот пример кода:

#!/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()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.