เขียนลงในสเปรดชีต Excel


149

ฉันยังใหม่กับ Python ฉันต้องเขียนข้อมูลบางอย่างจากโปรแกรมของฉันไปยังสเปรดชีต ฉันค้นหาทางออนไลน์และดูเหมือนจะมีแพ็คเกจให้เลือกมากมาย (xlwt, XlsXcessive, openpyxl) คนอื่น ๆ แนะนำให้เขียนไฟล์. csv (ไม่เคยใช้ CSV และไม่เข้าใจว่ามันคืออะไร)

โปรแกรมนี้ง่ายมาก ฉันมีสองรายการ (ลอย) และสามตัวแปร (สตริง) ฉันไม่ทราบความยาวของสองรายการและพวกเขาอาจจะไม่ยาวเท่ากัน

ฉันต้องการให้เลย์เอาต์เป็นดังในภาพด้านล่าง:

ตัวอย่างโครงร่าง

คอลัมน์สีชมพูจะมีค่าของรายการแรกและคอลัมน์สีเขียวจะมีค่าของรายการที่สอง

ดังนั้นวิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

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 for loop (ค่า list1) เป็นวิทยาศาสตร์หรือตัวเลขได้อย่างไร

ฉันไม่ต้องการที่จะตัดทอนค่า ค่าจริงที่ใช้ในโปรแกรมจะมีตัวเลขประมาณ 10 หลักหลังจุดทศนิยม


คุณจะเข้าใจว่าไฟล์ tsv คืออะไรถ้าคุณเปิดในโปรแกรมแก้ไขข้อความเช่น notepad / wordpad ข้อได้เปรียบที่สำคัญของการใช้ tsv คือคุณสามารถมั่นใจได้ว่าโดยทั่วไปโปรแกรมสเปรดชีตทุกรุ่นสามารถเปิดได้และไม่เพียง แต่ Office Excel's Excel 2010 เท่านั้น
goncalopp

ใช้รูปแบบสตริงในไพ ธ อนเพื่อควบคุมการแสดงข้อมูลตัวเลข
Fred Mitchell

ตรวจสอบopenpyxlเพื่อทำงานกับไฟล์. xlsx
Santiago

คำตอบ:


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 ได้โดยตรง
Michael Dillon

1
ลิงค์มีประโยชน์มาก ขอบคุณ
Jey

3
เพิ่งทราบว่าด้วยการ จำกัด จำนวนแถวสูงสุดของรหัสนี้คือ 65536 แถวเนื่องจากไฟล์. xls สนับสนุนเฉพาะแถวจำนวนมาก
Shreyas Pimpalgaonkar

1
เพื่อความชัดเจนxlwtใช้สำหรับการเขียน.xlsไฟล์เก่าสำหรับ Excel 2003 หรือก่อนหน้าเท่านั้น สิ่งนี้อาจล้าสมัย (ขึ้นอยู่กับความต้องการของคุณ)
ประสานงาน

คุณสามารถตรวจสอบopenpyxlเพื่อทำงานกับไฟล์. xlsx
Santiago

140

ใช้DataFrame.to_excelจากหมีแพนด้า นุ่นช่วยให้คุณสามารถแสดงข้อมูลของคุณในโครงสร้างข้อมูลที่หลากหลายและจะช่วยให้คุณอ่านไฟล์ 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

เป็นคนดี แต่ overkill เล็กน้อย +1
Burhan Khalid

2
ค่อนข้างแน่ใจว่านุ่นใช้ห้องสมุด xlrd / xlwt เพื่อความสามารถในการใช้งานที่ยอดเยี่ยมของ pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey

6
ฉันสมมติว่ามันใช้xlwtด้วย แต่ได้รับopenpyxlข้อผิดพลาด สำหรับคนอื่นที่สับสนในเรื่องนี้ - ทั้งหมดอยู่ในประเภทไฟล์ที่คุณต้องการ เอกสารแพนด้า (0.12) บอกว่า "ไฟล์ที่มี.xlsนามสกุลจะเขียนโดยใช้ xlwt และไฟล์ที่มี.xlsxนามสกุลนั้นจะถูกเขียนโดยใช้ openpyxl"
Racing Tadpole

5
ไม่แน่ใจว่าทำไมคนพูดถึงมันเกินจริง สำหรับวัตถุประสงค์ของฉันมันเป็นเพียงสิ่งที่ฉันกำลังมองหา ขอบคุณ!
Abe

35
  • xlrd / xlwt (มาตรฐาน): Python ไม่มีฟังก์ชันนี้ในไลบรารีมาตรฐาน แต่ฉันคิดว่าxlrd / xlwtเป็นวิธี "มาตรฐาน" ในการอ่านและเขียนไฟล์ excel การสร้างสมุดงานเพิ่มแผ่นงานเขียนข้อมูล / สูตรและจัดรูปแบบเซลล์ค่อนข้างง่าย หากคุณต้องการทุกสิ่งเหล่านี้คุณอาจประสบความสำเร็จมากที่สุดกับห้องสมุดนี้ ฉันคิดว่าคุณสามารถเลือก openpyxl แทนและมันจะค่อนข้างคล้ายกัน แต่ฉันไม่ได้ใช้มัน

    ในการจัดรูปแบบเซลล์ด้วย xlwt ให้กำหนดXFStyleและรวมสไตล์เมื่อคุณเขียนลงในชีต นี่คือตัวอย่างที่มีรูปแบบตัวเลขจำนวนมาก ดูรหัสตัวอย่างด้านล่าง

  • Tablib (ทรงพลังใช้งานง่าย): Tablibเป็นห้องสมุดที่ทรงพลัง แต่ใช้งานง่ายกว่าสำหรับการทำงานกับข้อมูลตาราง มันสามารถเขียนเวิร์กบุ๊ก Excel ที่มีหลายแผ่นรวมทั้งรูปแบบอื่น ๆ เช่น csv, json และ yaml หากคุณไม่ต้องการเซลล์ที่มีการจัดรูปแบบ (เช่นสีพื้นหลัง) คุณจะทำประโยชน์ให้ตัวเองในการใช้ไลบรารี่นี้ซึ่งจะทำให้คุณอยู่ในระยะยาว

  • CSV (ง่าย): ไฟล์ในคอมพิวเตอร์ของคุณเป็นข้อความหรือไบนารีไบนารีไฟล์ข้อความเป็นเพียงตัวอักษรรวมถึงไฟล์พิเศษเช่นบรรทัดใหม่และแท็บและสามารถเปิดได้อย่างง่ายดายทุกที่ (เช่น Notepad เว็บเบราว์เซอร์หรือผลิตภัณฑ์ Office) ไฟล์ csv เป็นไฟล์ข้อความที่จัดรูปแบบในบางวิธี: แต่ละบรรทัดเป็นรายการค่าคั่นด้วยเครื่องหมายจุลภาค โปรแกรม Python สามารถอ่านและเขียนข้อความได้อย่างง่ายดายดังนั้นไฟล์ csv เป็นวิธีที่ง่ายที่สุดและเร็วที่สุดในการส่งออกข้อมูลจากโปรแกรม python ของคุณไปยัง excel (หรือโปรแกรม python อื่น)

    ไฟล์ Excel เป็นไบนารีและต้องการไลบรารีพิเศษที่ทราบรูปแบบไฟล์ซึ่งเป็นสาเหตุที่คุณต้องการไลบรารีเพิ่มเติมสำหรับไพ ธ อนหรือโปรแกรมพิเศษเช่น 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
John Y

13

ฉันสำรวจโมดูล Excel บางตัวสำหรับ Python และพบว่าopenpyxlนั้นดีที่สุด

หนังสือฟรีทำให้ Boring Stuff ด้วย Python มีบทใน openpyxlพร้อมรายละเอียดเพิ่มเติมหรือคุณสามารถตรวจสอบอ่านเอกสารไซต์คุณไม่จำเป็นต้องติดตั้ง 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 มันเป็นเพียงรูปแบบข้อมูลสำหรับการนำเข้าและส่งออก
Michael Dillon

5
คุณอาจต้องการใช้โมดูล csv ที่รวมอยู่ในไลบรารีมาตรฐานหากคุณกำลังจะทำสิ่งนี้ มันจัดการกับการอ้างอิงที่ดีกว่าตัวอย่างเช่น
Flimm

@ สรุปฉันจะเขียนไปยังเซลล์อื่นได้อย่างไร
oldboy

ถ้าคุณกำลังใช้งูหลามที่ 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 - Add-in ของ 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

@Atinesh - ขอบคุณสำหรับความคิดเห็น - openpyxl.load_workbookโหลดสมุดงานซึ่งมีอยู่แล้ว สร้างไฟล์New.xlsxเพื่อหลีกเลี่ยงข้อผิดพลาดนี้
Vityata

1
ตกลงขอบคุณสำหรับคำแนะนำ
Atinesh

โปรดทราบว่า openpyxl ไม่รองรับรูปแบบ 'xls' ที่เก่ากว่า
ทิโมธีซีควินน์

2

xlsxwriterห้องสมุดเป็นที่ดีสำหรับการสร้าง.xlsxไฟล์ ตัวอย่างต่อไปนี้สร้าง.xlsxไฟล์จากรายการ dicts ขณะที่ระบุคำสั่งซื้อและชื่อที่แสดง :

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 - ฉันตั้งใจไม่ตอบรับกรณีที่ OP ที่นำเสนอ ฉันขอนำเสนอวิธีแก้ปัญหาทั่วไปมากกว่า IMHO ที่ผู้เยี่ยมชมส่วนใหญ่แสวงหา ชื่อของคำถามนี้ได้รับการจัดทำดัชนีอย่างดีในเครื่องมือค้นหาและติดตามการเข้าชมจำนวนมาก

ป้อนคำอธิบายรูปภาพที่นี่

💡 Note 2 - หากคุณไม่ได้ใช้ Python3.6 หรือใหม่กว่าพิจารณาใช้ในOrderedDict headersก่อนที่ Python3.6 คำสั่งdictจะไม่ถูกเก็บรักษาไว้



0

วิธีที่ง่ายที่สุดที่จะนำเข้าตัวเลขที่แน่นอนคือการเพิ่มทศนิยมหลังจากที่ตัวเลขในของคุณและl1 l2Python ตีความจุดทศนิยมนี้เป็นคำแนะนำจากคุณเพื่อรวมจำนวนที่แน่นอน หากคุณต้องการ จำกัด ให้อยู่ในตำแหน่งทศนิยมคุณควรจะสามารถสร้างคำสั่งการพิมพ์ที่ จำกัด ผลลัพธ์ได้อย่างง่าย:

print variable_example[:13]

จะ จำกัด เฉพาะตำแหน่งที่สิบโดยสมมติว่าข้อมูลของคุณมีจำนวนเต็มสองตัวที่เหลืออยู่จากทศนิยม


0

คุณสามารถลองใช้ไลบรารี pythonของhfexcel Human Friendly object-oriented ตาม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 pyooคุณต้องติดตั้งไลบรารีบางส่วนและใช้เวลาไม่กี่ครั้งในการข้ามผ่าน แต่เมื่อตั้งค่าแล้วสิ่งนี้จะกันกระสุนได้เมื่อคุณใช้ประโยชน์จาก LibreOffice / OpenOffice API ที่กว้างและมั่นคง

โปรดดูส่วนสำคัญของฉันเกี่ยวกับวิธีการตั้งค่าระบบลินุกซ์และทำการเข้ารหัสขั้นพื้นฐานโดยใช้ 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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.