Bir Excel elektronik tablosuna yazma


159

Python'da yeniyim. Programımdan bir elektronik tabloya bazı veriler yazmam gerekiyor. İnternette arama yaptım ve pek çok paket var gibi görünüyor (xlwt, XlsXcessive, openpyxl). Diğerleri bir .csv dosyasına yazmayı önerir (hiç CSV kullanmadık ve ne olduğunu gerçekten anlamadım).

Program çok basit. İki listem (float) ve üç değişkenim (dizeler) var. İki listenin uzunluklarını bilmiyorum ve muhtemelen aynı uzunlukta olmayacaklar.

Düzenin aşağıdaki resimdeki gibi olmasını istiyorum:

Düzen örneği

Pembe sütun ilk listenin değerlerini ve yeşil sütun ikinci listenin değerlerini alacaktır.

Peki bunu yapmanın en iyi yolu nedir?

PS Windows 7 çalıştırıyorum, ancak bu programı çalıştıran bilgisayarlarda mutlaka Office'in yüklü olması gerekmiyor.

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

Bunu tüm önerilerinizi kullanarak yazdım. İşi hallediyor ama biraz geliştirilebilir.

For döngüsünde (list1 değerleri) oluşturulan hücreleri bilimsel veya sayı olarak nasıl biçimlendirebilirim?

Değerleri kesmek istemiyorum. Programda kullanılan gerçek değerler, ondalık sayıdan sonra yaklaşık 10 hane olacaktır.


Not defteri / wordpad gibi bir metin düzenleyicide açarsanız, tsv dosyasının ne olduğunu anlayacaksınız. TSV'yi kullanmanın en önemli avantajı, herhangi bir elektronik tablo programının temelde herhangi bir sürümünün onu açabileceğinden emin olabilmenizdir ve sadece ofis 2010'un
excel'i

Sayısal verilerin görünümünü kontrol etmek için python'da dize formatını kullanın.
Fred Mitchell

.xlsx dosyalarıyla çalışmak için openpyxl'i kontrol edin
Santiago

Yanıtlar:


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

daha fazla açıklama için: https://github.com/python-excel


13
Python'u Windows'ta çalıştırıyorsanız ve aynı makineye Excel yüklüyseniz, Excel'i doğrudan kontrol etmek için Python COM arayüzünü kullanabileceğinizi belirtmek isteyebilirsiniz.
Michael Dillon

1
Bağlantı çok yardımcı oldu. Teşekkürler
Jey

3
.Xls

1
Açık olmak gerekirse xlwt, yalnızca eski .xlsdosyaları Excel 2003 veya önceki sürümlere yazmak içindir. Bu modası geçmiş olabilir (ihtiyaçlarınıza bağlı olarak).
cowlinator

.Xlsx dosyalarıyla çalışmak için openpyxl'i kontrol edebilirsiniz
Santiago

145

Kullanım DataFrame.to_excel gelen pandalar . Pandalar, verilerinizi işlevsel açıdan zengin veri yapılarında temsil etmenize ve excel dosyalarında da okumanıza izin verir .

Önce verilerinizi bir DataFrame'e dönüştürmeniz ve ardından aşağıdaki gibi bir excel dosyasına kaydetmeniz gerekir:

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)

ve çıkan excel dosyası şöyle görünür:

görüntü açıklamasını buraya girin

Her iki listenin de eşit uzunlukta olması gerektiğini unutmayın, aksi takdirde pandalar şikayet eder. Bunu çözmek için tüm eksik değerleri ile değiştirin None.


Teşekkürler ama ihtiyaçlarım için fazla karmaşık görünüyor.
Jey

Güzel, ama biraz fazla +1
Burhan Khalid

2
Pandaların, excel yetenekleri için xlrd / xlwt kitaplıklarını kullandığından oldukça emin olabilirsiniz pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey

6
Ben de kullanıldığını varsayıyordum xlwtama bir openpyxlhata alıyorum. Bununla kafası karışan herkes için - hepsi istediğiniz dosya türünde. Pandalar (0.12) dokümanları " .xlsUzantılı dosyalar xlwt kullanılarak, uzantıya sahip olanlar ise .xlsxopenpyxl kullanılarak yazılacak" diyor.
Yarış Kurbağa Yavrusu

5
İnsanların neden aşırı olduğunu söylediğinden emin değilim. Benim amacım için tam da aradığım şeydi. Teşekkürler!
Abe

38
  • xlrd / xlwt (standart): Python, standart kitaplığında bu işlevselliğe sahip değil, ancak xlrd / xlwt'yi excel dosyalarını okumak ve yazmak için "standart" yol olarak düşünüyorum . Bir çalışma kitabı yapmak, sayfalar eklemek, veri / formül yazmak ve hücreleri biçimlendirmek oldukça kolaydır. Tüm bunlara ihtiyacınız varsa, en çok başarıyı bu kütüphane ile elde edebilirsiniz. Sanırım bunun yerine openpyxl'i seçebilirsin ve oldukça benzer olurdu, ama ben kullanmadım.

    Hücreleri xlwt ile biçimlendirmek için a tanımlayın XFStyleve bir sayfaya yazarken stili ekleyin. İşte birçok sayı biçimine sahip bir örnek . Aşağıdaki örnek koda bakın.

  • Tablib (güçlü, sezgisel): Tablib , tablo verileriyle çalışmak için daha güçlü ancak sezgisel bir kitaplıktır. Birden çok sayfalı excel çalışma kitaplarının yanı sıra csv, json ve yaml gibi diğer biçimler de yazabilir. Biçimlendirilmiş hücrelere ihtiyacınız yoksa (arka plan rengi gibi), bu kitaplığı kullanmak için kendinize bir iyilik yapacaksınız, bu da sizi uzun vadede daha ileriye götürecektir.

  • csv (kolay): Bilgisayarınızdaki dosyalar ya metin ya da ikilidir . Metin dosyaları, satırsonları ve sekmeler gibi özel olanlar da dahil olmak üzere yalnızca karakterlerdir ve her yerde kolayca açılabilir (örneğin, not defteri, web tarayıcınız veya Office ürünleri). Bir csv dosyası, belirli bir şekilde biçimlendirilmiş bir metin dosyasıdır: her satır, virgülle ayrılmış bir değerler listesidir. Python programları metni kolayca okuyabilir ve yazabilir, bu nedenle csv dosyası, python programınızdan excel'e (veya başka bir python programına) veri aktarmanın en kolay ve en hızlı yoludur.

    Excel dosyaları ikilidir ve dosya biçimini bilen özel kitaplıklar gerektirir, bu nedenle python için ek bir kitaplığa veya bunları okumak / yazmak için Microsoft Excel, Gnumeric veya LibreOffice gibi özel bir programa ihtiyacınız vardır.


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
Bir CSV dosyası yazacaksanız , muhtemelen standart kitaplıkta bulunan csv modülünü kullanmak istersiniz .
Flimm

1
Özellikle önemli olduğundan değil, ancak Tablib, diğer birçok üst düzey paket gibi, Excel dosyalarını çıkarmak için xlwt kullanır.
John Y

13

Python için birkaç Excel modülünü araştırdım ve openpyxl'in en iyisi olduğunu buldum .

Python ile Sıkıcı İşleri Otomatikleştirin adlı ücretsiz kitabın openpyxl hakkında daha fazla ayrıntı içeren bir bölümü vardır veya Belgeleri sitesini . Openpyxl'i kullanmak için Office veya Excel'in kurulu olmasına ihtiyacınız olmayacak.

Programınız şunun gibi görünecektir:

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

Şu hatayı alıyorum: excel için int64 dönüştürmek olamaz
pnkjmndhl

11

CSV, virgülle ayrılmış değerler anlamına gelir. CSV bir metin dosyası gibidir ve basitçe .CSV uzantısı

örneğin bu kodu yazın:

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

bu dosyayı excel ile açabilirsiniz.


5
CSV kullanarak sütun arka planlarını formatlayamazsınız. Yalnızca içe ve dışa aktarım için bir veri formatıdır.
Michael Dillon

5
Bunu yapacaksanız, muhtemelen standart kitaplıkta bulunan csv modülünü kullanmak istersiniz . Örneğin, alıntı yapmayı daha iyi halleder.
Flimm

@Flimm nasıl basitçe farklı hücrelere yazabilirim?
oldboy

Python 3 kullanıyorsanız ve benzeri dosya ASCII olmayan karakterler içeriyorsa éveya daha iyi bir do f.write('\xEF\xBB\xBF')sonra sağa open(). Yani BOM (olan bayt sırası işareti UTF-8 kodlaması tanımak Microsoft yazılımı için gerekli, gerektiği kadar)
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

Aşağıdaki kitaplıklara da bir göz atmayı deneyin:

xlwings - Python'dan bir elektronik tabloya veri almak ve çıkarmak, ayrıca çalışma kitaplarını ve grafikleri değiştirmek için

ExcelPython - VBA yerine Python'da kullanıcı tanımlı işlevler (UDF'ler) ve makrolar yazmak için bir Excel eklentisi


3

xlsxwriterKütüphane oluşturmak için mükemmeldir .xlsxdosyaları. Aşağıdaki kod parçası .xlsx, sırayı ve görüntülenen adları belirtirken bir dikt listesinden bir dosya oluşturur :

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)

görüntü açıklamasını buraya girin


💡 Not 1 - Kasıtlı olarak OP'nin sunduğu davayı tam olarak yanıtlamıyorum. Bunun yerine, çoğu ziyaretçinin aradığı daha genel bir çözüm IMHO sunuyorum. Bu sorunun başlığı arama motorlarında iyi dizine eklenmiştir ve çok sayıda trafiği izler

görüntü açıklamasını buraya girin

💡 Not 2 - Eğer ediyorsanız değil Python3.6 kullanarak veya daha yeni, kullanmayı düşünün OrderedDictiçinde headers. Python3.6'dan önce sipariş korunmuyordu dict.



2

OpenPyxl Excel 2010 xlsx / xlsm dosyalarını okumak / yazmak için oluşturulmuş oldukça güzel bir kitaplık:

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

Buna atıfta bulunan diğer cevap , deperciated işlevi ( get_sheet_by_name) kullanmaktır. Onsuz nasıl yapılır:

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
Yukarıdaki kod hata üretirFileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Atinesh

@Atinesh - Geri bildiriminiz için teşekkür ederiz - openpyxl.load_workbookzaten mevcut olan bir çalışma kitabını yükler. New.xlsxBu hatayı önlemek için bir dosya oluşturun .
Vityata

1
Tamam Öneriniz için teşekkür ederiz
Atinesh

Openpyxl'in eski 'xls' biçimini desteklemediğini unutmayın.
Timothy C. Quinn

0

Tam sayıları içe aktarmanın en kolay yolu, l1ve l2. İçindeki sayılardan sonra bir ondalık eklemektir . Python, bu ondalık noktayı tam sayıyı dahil etmeniz için sizden gelen talimatlar olarak yorumlar. Bunu ondalık basamaklarla sınırlamanız gerekiyorsa, çıktıyı sınırlayan bir yazdırma komutu oluşturabilmeniz gerekir, örneğin:

print variable_example[:13]

Verilerinizin ondalık basamağın iki tamsayısına sahip olduğunu varsayarak, ondalık basamakla sınırlandırır.


0

Deneyebilirsin hfexcel dayalı İnsan Dostu nesne yönelimli Python kütüphanesi 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

İhtiyacınız mevcut bir çalışma kitabını değiştirmekse, en güvenli yol pyoo kullanmak olacaktır . Bazı kitaplıkların kurulu olması gerekir ve atlamak için birkaç çember gerekir, ancak bir kez kurulduktan sonra, LibreOffice / OpenOffice'in geniş ve sağlam API'lerinden yararlandığınız için bu kurşun geçirmez olacaktır.

Benim bakınız Özü bir linux sistemini kurmak için nasıl ve bazı temel kodlama kullanarak pyoo yapmak.

İşte kodun bir örneği:

#!/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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.