Запис у таблицю Excel


149

Я новачок у Python. Мені потрібно записати деякі дані з моєї програми в електронну таблицю. Я шукав в Інтернеті, і, здається, доступно багато пакетів (xlwt, XlsXcessive, openpyxl). Інші пропонують написати у .csv файл (ніколи не використовується CSV і не розумію, що це таке).

Програма дуже проста. У мене є два списки (float) і три змінні (string). Я не знаю довжини двох списків, і вони, ймовірно, не будуть однаковою.

Я хочу, щоб макет був таким, як на малюнку нижче:

Зразок макета

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

То який найкращий спосіб це зробити?

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 (список1 значень), як наукові чи чисельні?

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


Ви зрозумієте, що таке tsv-файл, якщо відкриєте його в текстовому редакторі, наприклад блокнот / слово. Основна перевага використання телевізора полягає в тому, що ви можете бути впевнені, що в основному будь-яка версія будь-якої програми електронних таблиць може відкрити її, і не тільки
відмінний

Використовуйте формат рядка в 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
Посилання було дуже корисним. Спасибі
Джей

3
Зауважте лише, що при цьому коді максимальний ліміт рядків - 65536 рядків, оскільки .xls файли підтримують лише стільки рядків
Shreyas Pimpalgaonkar

1
Щоб було зрозуміло, xlwtце лише для запису старих .xlsфайлів для Excel 2003 або новіших версій. Це може бути застарілим (залежно від ваших потреб).
каулінатор

Ви можете перевірити 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.


Дякую, але здається занадто складним для моїх потреб.
Джей

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

2
Досить впевнені, що панди використовують бібліотеки xlrd / xlwt для своїх можливостей excel 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 є найкращим.

Безкоштовна книга Автоматизація нудних речей з 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 як мені просто написати в різні комірки?
oldboy

якщо ви використовуєте Python 3, а файл містить символи, що не належать до ASCII, як-от éабо , краще зробити це f.write('\xEF\xBB\xBF')відразу після open(). Це BOM ( байтовий порядок , qv), необхідний програмному забезпеченню Microsoft для розпізнавання кодування 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

Спробуйте також поглянути на наступні бібліотеки:

xlwings - для отримання даних у та з електронної таблиці з Python, а також для керування робочими книжками та діаграмами

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


2

OpenPyxl це дуже приємна бібліотека, створена для читання / запису файлів xlsx / xlsm Excel 2010:

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

Інша відповідь , що посилається на неї, - це використання деперсифікованої функції ( 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
Добре Дякую за пропозицію
Atinesh

Зауважте, що 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. Якщо ви не використовуєте Python3.6 або новішої версії, розгляньте можливість використання OrderedDictв headers. До Python3.6 порядок в dictне зберігався.



0

Найпростіший спосіб імпортувати точні числа - додати десятковий знак після цифр у вашому l1та l2. Python інтерпретує цю десяткову точку як інструкцію від вас, щоб вказати точне число. Якщо вам потрібно обмежити його десятковою комою, ви повинні мати можливість створити команду друку, яка обмежує вихід, щось таке, як:

print variable_example[:13]

Обмежимо це десятим знаком після коми, якщо у ваших даних залишилося два цілих числа від десяткових.


0

Ви можете спробувати hfexcel Human Friendly об'єктно-орієнтовану бібліотеку пітонів на основі 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.