Menulis ke spreadsheet Excel

149

Saya baru mengenal Python. Saya perlu menulis beberapa data dari program saya ke spreadsheet. Saya telah mencari secara online dan sepertinya ada banyak paket yang tersedia (xlwt, XlsXcessive, openpyxl). Yang lain menyarankan untuk menulis ke file .csv (tidak pernah menggunakan CSV dan tidak benar-benar mengerti apa itu).

Programnya sangat sederhana. Saya punya dua daftar (float) dan tiga variabel (string). Saya tidak tahu panjang kedua daftar dan mungkin panjangnya tidak sama.

Saya ingin tata letak seperti pada gambar di bawah ini:

Contoh tata letak

Kolom merah muda akan memiliki nilai daftar pertama dan kolom hijau akan memiliki nilai daftar kedua.

Jadi apa cara terbaik untuk melakukan ini?

PS Saya menjalankan Windows 7 tetapi saya tidak perlu menginstal Office pada komputer yang menjalankan program ini.

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

Saya menulis ini menggunakan semua saran Anda. Ini menyelesaikan pekerjaan tetapi bisa sedikit ditingkatkan.

Bagaimana cara memformat sel yang dibuat dalam for for (nilai list1) sebagai ilmiah atau angka?

Saya tidak ingin memotong nilai. Nilai aktual yang digunakan dalam program akan memiliki sekitar 10 digit setelah desimal.

Jey
sumber
Anda akan mengerti apa itu file tsv jika Anda membukanya di editor teks seperti notepad / wordpad. Keuntungan utama menggunakan tsv adalah Anda dapat yakin bahwa pada dasarnya semua versi program spreadsheet apa pun dapat membukanya, dan tidak hanya office excel 2010
goncalopp
Gunakan format string dalam python untuk mengontrol tampilan data numerik.
Fred Mitchell
periksa openpyxl untuk bekerja dengan file .xlsx
Santiago

Jawaban:

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)

untuk penjelasan lebih lanjut: https://github.com/python-excel

terima kasih
sumber
13
Anda mungkin ingin menyebutkan bahwa jika Anda menjalankan Python di Windows dan menginstal Excel pada mesin yang sama, Anda dapat menggunakan antarmuka Python COM untuk langsung mengendalikan Excel.
Michael Dillon
1
Tautan itu sangat membantu. Terima kasih
Jey
3
Perhatikan bahwa dengan batas maksimum kode ini adalah 65536 baris, karena file .xls hanya mendukung banyak baris
Shreyas Pimpalgaonkar
1
Agar jelas, xlwthanya untuk menulis .xlsfile lama untuk Excel 2003 atau sebelumnya. Ini mungkin sudah usang (tergantung kebutuhan Anda).
cowlinator
Anda dapat memeriksa openpyxl agar berfungsi dengan file .xlsx
Santiago
140

Gunakan DataFrame.to_excel dari panda . Panda memungkinkan Anda untuk merepresentasikan data Anda dalam struktur data yang kaya fungsional dan akan membiarkan Anda membaca file excel juga.

Pertama-tama Anda harus mengubah data Anda menjadi DataFrame dan kemudian menyimpannya ke file excel seperti:

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)

dan file excel yang keluar terlihat seperti ini:

masukkan deskripsi gambar di sini

Perhatikan bahwa kedua daftar harus memiliki panjang yang sama dengan yang lain, panda akan mengeluh. Untuk mengatasi ini, ganti semua nilai yang hilang dengan None.

diliop
sumber
Terima kasih tetapi tampaknya terlalu rumit untuk kebutuhan saya.
Jey
Bagus, tapi sedikit berlebihan +1
Burhan Khalid
2
Pandanda cukup yakin menggunakan pustaka xlrd / xlwt untuk kapabilitas excel pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey
6
Saya berasumsi itu digunakan xlwtjuga, tetapi mendapatkan openpyxlkesalahan. Untuk siapa pun yang bingung dengan ini - itu semua dalam tipe file yang Anda inginkan. Para panda (0,12) dokumen mengatakan "File dengan .xlsekstensi akan ditulis menggunakan xlwt dan file dengan .xlsxekstensi akan ditulis menggunakan openpyxl".
Balap Kecebong
5
Tidak yakin mengapa orang mengatakan itu berlebihan. Untuk tujuan saya, itulah yang saya cari. Terima kasih!
Abe
35
  • xlrd / xlwt (standar): Python tidak memiliki fungsi ini di perpustakaan standarnya, tapi saya pikir xlrd / xlwt sebagai cara "standar" untuk membaca dan menulis file excel. Cukup mudah untuk membuat buku kerja, menambahkan lembar, menulis data / formula, dan memformat sel. Jika Anda membutuhkan semua hal ini, Anda mungkin paling sukses dengan perpustakaan ini. Saya pikir Anda bisa memilih openpyxl sebagai gantinya dan itu akan sangat mirip, tapi saya belum menggunakannya.

    Untuk memformat sel dengan xlwt, tentukan a XFStyledan sertakan gaya saat Anda menulis ke selembar. Ini adalah contoh dengan banyak format angka . Lihat contoh kode di bawah ini.

  • Tablib (kuat, intuitif): Tablib adalah perpustakaan yang lebih kuat namun intuitif untuk bekerja dengan data tabular. Itu dapat menulis buku kerja excel dengan banyak lembar serta format lain, seperti csv, json, dan yaml. Jika Anda tidak membutuhkan sel yang diformat (seperti warna latar belakang), Anda sebaiknya menggunakan pustaka ini, yang akan membuat Anda lebih jauh dalam jangka panjang.

  • csv (mudah): File di komputer Anda berupa teks atau biner . File teks hanyalah karakter, termasuk yang khusus seperti baris baru dan tab, dan dapat dengan mudah dibuka di mana saja (mis. Notepad, browser web Anda, atau produk Office). File csv adalah file teks yang diformat dengan cara tertentu: setiap baris adalah daftar nilai, dipisahkan dengan koma. Program python dapat dengan mudah membaca dan menulis teks, jadi file csv adalah cara termudah dan tercepat untuk mengekspor data dari program python Anda ke excel (atau program python lain).

    File Excel adalah biner dan memerlukan pustaka khusus yang mengetahui format file, itulah sebabnya Anda memerlukan pustaka tambahan untuk python, atau program khusus seperti Microsoft Excel, Gnumeric, atau LibreOffice, untuk membaca / menulisnya.


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
sumber
2
Anda mungkin ingin menggunakan modul csv yang termasuk dalam perpustakaan standar jika Anda ingin menulis file CSV.
Flimm
1
Bukan berarti itu penting, tetapi Tablib, seperti banyak paket tingkat tinggi lainnya, menggunakan xlwt untuk menghasilkan file Excel.
John Y
13

Saya mensurvei beberapa modul Excel untuk Python, dan menemukan openpyxl menjadi yang terbaik.

Buku gratis Automate the Boring Stuff with Python memiliki bab tentang openpyxl dengan lebih detail atau Anda dapat memeriksa situs Baca the Documents . Anda tidak perlu menginstal Office atau Excel untuk menggunakan openpyxl.

Program Anda akan terlihat seperti ini:

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
sumber
Saya mendapatkan pesan kesalahan: tidak dapat mengonversi int64 ke excel
pnkjmndhl
11

CSV adalah singkatan dari nilai yang dipisahkan koma. CSV seperti file teks dan dapat dibuat hanya dengan menambahkan ekstensi .CSV

misalnya menulis kode ini:

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

Anda dapat membuka file ini dengan excel.

2 8
sumber
5
Anda tidak dapat memformat latar belakang kolom menggunakan CSV. Ini hanya format data untuk impor dan ekspor.
Michael Dillon
5
Anda mungkin ingin menggunakan modul csv yang termasuk dalam perpustakaan standar jika Anda akan melakukan ini. Ini menangani mengutip lebih baik, misalnya.
Flimm
@Flimm bagaimana cara saya menulis ke sel yang berbeda?
oldboy
jika Anda menggunakan Python 3 dan file tersebut berisi karakter non-ASCII, seperti éatau , lebih baik Anda lakukan f.write('\xEF\xBB\xBF')setelah open(). Itu adalah BOM ( tanda urutan byte , qv), yang dibutuhkan oleh perangkat lunak Microsoft untuk mengenali pengkodean 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
sumber
7

Coba lihat juga perpustakaan berikut:

xlwings - untuk mendapatkan data masuk dan keluar dari spreadsheet dari Python, serta memanipulasi buku kerja dan bagan

ExcelPython - add-in Excel untuk menulis fungsi yang ditentukan pengguna (UDF) dan makro dalam Python, bukan VBA

ehremo
sumber
2

OpenPyxl adalah pustaka yang cukup bagus, dibangun untuk membaca / menulis file Excel 2010 xlsx / xlsm:

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

Jawaban lainnya , merujuk padanya menggunakan fungsi deperciated ( get_sheet_by_name). Ini adalah bagaimana melakukannya tanpa itu:

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
sumber
1
Kode di atas menghasilkan kesalahanFileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Atinesh
@Atinesh - Terima kasih atas umpan baliknya - openpyxl.load_workbookmemuat buku kerja, yang sudah ada. Buat file New.xlsxuntuk menghindari kesalahan ini.
Vityata
1
OK Terima kasih atas sarannya
Atinesh
Perhatikan bahwa openpyxl tidak mendukung format 'xls' yang lebih lama.
Timothy C. Quinn
2

The xlsxwriterperpustakaan besar untuk menciptakan .xlsxfile. Cuplikan berikut menghasilkan .xlsxfile dari daftar dicts sambil menyatakan urutan dan nama yang ditampilkan :

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)

masukkan deskripsi gambar di sini


💡 Catatan 1 - Saya sengaja tidak menjawab kasus persis yang disajikan OP. Sebaliknya, saya menyajikan solusi IMHO yang lebih umum yang dicari kebanyakan pengunjung. Judul pertanyaan ini diindeks dengan baik di mesin pencari dan melacak banyak lalu lintas

masukkan deskripsi gambar di sini

💡 Catatan 2 - Jika Anda tidak menggunakan Python3.6 atau yang lebih baru, pertimbangkan untuk menggunakan OrderedDictdi headers. Sebelum Python3.6 pesanan dicttidak disimpan.


Jossef Harush
sumber
0

Cara termudah untuk mengimpor angka pastinya adalah dengan menambahkan desimal setelah angka di l1dan l2. Python menginterpretasikan titik desimal ini sebagai instruksi dari Anda untuk memasukkan angka pastinya. Jika Anda perlu membatasi ke beberapa tempat desimal, Anda harus dapat membuat perintah cetak yang membatasi output, sesuatu yang sederhana seperti:

print variable_example[:13]

Akan membatasi ke tempat desimal kesepuluh, dengan asumsi data Anda memiliki dua bilangan bulat tersisa dari desimal.

Kyle Cyree
sumber
0

Anda dapat mencoba hfexcel pustaka berorientasi objek yang Ramah Manusia berdasarkan 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
sumber
0

Jika kebutuhan Anda adalah memodifikasi buku kerja yang ada, cara paling aman adalah dengan menggunakan pyoo . Anda perlu memiliki beberapa pustaka yang diinstal dan dibutuhkan beberapa rintangan untuk melompati tetapi begitu diatur, ini akan menjadi anti peluru karena Anda meningkatkan API LibreOffice / OpenOffice yang lebar dan solid.

Silakan lihat Gist saya tentang cara mengatur sistem linux dan melakukan beberapa pengkodean dasar menggunakan pyoo.

Berikut ini contoh kode:

#!/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
sumber