Viết vào bảng tính Excel


149

Tôi chưa quen với Python. Tôi cần phải viết một số dữ liệu từ chương trình của tôi vào một bảng tính. Tôi đã tìm kiếm trực tuyến và dường như có nhiều gói có sẵn (xlwt, XlsXcessive, openpyxl). Những người khác đề nghị ghi vào tệp .csv (không bao giờ sử dụng CSV và không thực sự hiểu nó là gì).

Chương trình rất đơn giản. Tôi có hai danh sách (float) và ba biến (chuỗi). Tôi không biết độ dài của hai danh sách và chúng có thể sẽ không có cùng độ dài.

Tôi muốn bố cục như trong hình dưới đây:

Mẫu bố cục

Cột màu hồng sẽ có các giá trị của danh sách thứ nhất và cột màu xanh lá cây sẽ có các giá trị của danh sách thứ hai.

Vì vậy, cách tốt nhất để làm điều này là gì?

PS Tôi đang chạy Windows 7 nhưng tôi không nhất thiết phải cài đặt Office trên các máy tính chạy chương trình này.

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

Tôi đã viết điều này bằng cách sử dụng tất cả các đề xuất của bạn. Nó hoàn thành công việc nhưng nó có thể được cải thiện đôi chút.

Làm cách nào để định dạng các ô được tạo trong vòng lặp for (giá trị list1) là khoa học hoặc số?

Tôi không muốn cắt bớt các giá trị. Các giá trị thực tế được sử dụng trong chương trình sẽ có khoảng 10 chữ số sau số thập phân.


Bạn sẽ hiểu tệp tsv là gì nếu bạn mở nó trong trình soạn thảo văn bản như notepad / wordpad. Lợi thế chính của việc sử dụng tsv là bạn có thể tự tin rằng về cơ bản bất kỳ phiên bản nào của bất kỳ chương trình bảng tính nào cũng có thể mở nó và không chỉ excel của văn phòng 2010
goncalopp

Sử dụng định dạng chuỗi trong python để điều khiển hiển thị dữ liệu số.
Fred Mitchell

kiểm tra openpyxl để làm việc với các tệp .xlsx
Santiago

Câu trả lời:


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)

để được giải thích thêm: https://github.com/python-excel


13
Bạn có thể muốn đề cập rằng nếu bạn đang chạy Python trên Windows và đã cài đặt Excel trên cùng một máy, bạn có thể sử dụng giao diện COM COM của Python để điều khiển trực tiếp Excel.
Michael Dillon

1
Các liên kết là rất hữu ích. Cảm ơn
Jey

3
Chỉ cần lưu ý rằng với mã giới hạn hàng tối đa này là 65536 hàng, vì các tệp .xls chỉ hỗ trợ nhiều hàng
Shreyas Pimpalgaonkar

1
Để rõ ràng, xlwtchỉ dành cho việc ghi các .xlstệp cũ cho Excel 2003 hoặc sớm hơn. Điều này có thể bị lỗi thời (tùy thuộc vào nhu cầu của bạn).
chăn bò

Bạn có thể kiểm tra openpyxl để hoạt động với các tệp .xlsx
Santiago

140

Sử dụng DataFrame.to_excel từ gấu trúc . Pandas cho phép bạn thể hiện dữ liệu của mình trong các cơ sở dữ liệu phong phú về chức năng và cũng sẽ cho phép bạn đọc trong các tệp excel.

Trước tiên, bạn sẽ phải chuyển đổi dữ liệu của mình thành DataFrame và sau đó lưu dữ liệu vào tệp excel như vậy:

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)

và tệp excel xuất hiện như thế này:

nhập mô tả hình ảnh ở đây

Lưu ý rằng cả hai danh sách cần phải có độ dài bằng nhau, những con gấu trúc khác sẽ phàn nàn. Để giải quyết điều này, thay thế tất cả các giá trị còn thiếu bằng None.


Cảm ơn nhưng dường như quá phức tạp cho nhu cầu của tôi.
Jey

Đẹp một chút, nhưng hơi quá mức +1
Burhan Khalid

2
Khá chắc chắn gấu trúc sử dụng các thư viện xlrd / xlwt cho các khả năng excel của nó pandas.pydata.org/pandas-docs/urdy/io.html#excel-files
mrmagooey

6
Tôi đã giả sử nó được sử dụng xlwtquá, nhưng nhận được một openpyxllỗi. Đối với bất kỳ ai khác bị nhầm lẫn bởi điều này - đó là tất cả trong loại phim bạn muốn. Các tài liệu về gấu trúc (0.12) cho biết "Các tệp có .xlsphần mở rộng sẽ được viết bằng xlwt và các tệp có .xlsxphần mở rộng sẽ được viết bằng openpyxl".
Đua nòng nọc

5
Không chắc chắn tại sao mọi người nói rằng nó quá mức cần thiết. Đối với mục đích của tôi, đó chỉ là những gì tôi đang tìm kiếm. Cảm ơn!
Abe

35
  • xlrd / xlwt (tiêu chuẩn): Python không có chức năng này trong thư viện chuẩn của nó, nhưng tôi nghĩ xlrd / xlwt là cách "tiêu chuẩn" để đọc và ghi tệp excel. Nó khá dễ dàng để tạo một bảng tính, thêm trang tính, ghi dữ liệu / công thức và định dạng ô. Nếu bạn cần tất cả những điều này, bạn có thể có nhiều thành công nhất với thư viện này. Tôi nghĩ rằng bạn có thể chọn openpyxl thay vào đó và nó sẽ khá giống nhau, nhưng tôi chưa sử dụng nó.

    Để định dạng các ô bằng xlwt, xác định a XFStylevà bao gồm kiểu khi bạn viết vào một trang tính. Dưới đây là một ví dụ với nhiều định dạng số . Xem mã ví dụ dưới đây.

  • Tablib (mạnh mẽ, trực quan): Tablib là một thư viện mạnh mẽ hơn nhưng trực quan hơn để làm việc với dữ liệu dạng bảng. Nó có thể viết sổ làm việc excel với nhiều trang tính cũng như các định dạng khác, chẳng hạn như csv, json và yaml. Nếu bạn không cần các ô được định dạng (như màu nền), bạn sẽ tự mình sử dụng thư viện này, điều này sẽ giúp bạn đi xa hơn trong thời gian dài.

  • csv (dễ dàng): Các tệp trên máy tính của bạn là văn bản hoặc nhị phân . Các tệp văn bản chỉ là các ký tự, bao gồm các ký tự đặc biệt như dòng mới và tab và có thể dễ dàng mở ở bất cứ đâu (ví dụ: notepad, trình duyệt web của bạn hoặc các sản phẩm Office). Tệp csv là một tệp văn bản được định dạng theo một cách nhất định: mỗi dòng là một danh sách các giá trị, được phân tách bằng dấu phẩy. Các chương trình Python có thể dễ dàng đọc và viết văn bản, vì vậy tệp csv là cách dễ nhất và nhanh nhất để xuất dữ liệu từ chương trình python của bạn sang excel (hoặc một chương trình python khác).

    Các tệp Excel là nhị phân và yêu cầu các thư viện đặc biệt biết định dạng tệp, đó là lý do tại sao bạn cần một thư viện bổ sung cho python hoặc một chương trình đặc biệt như Microsoft Excel, Gnumeric hoặc LibreOffice để đọc / ghi chúng.


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
Bạn có thể muốn sử dụng mô-đun csv có trong thư viện chuẩn nếu bạn định viết tệp CSV.
Flimm

1
Không phải là nó đặc biệt quan trọng, nhưng Tablib, giống như rất nhiều gói cấp cao khác, sử dụng xlwt để xuất các tệp Excel.
John Y

13

Tôi đã khảo sát một vài mô-đun Excel cho Python và thấy openpyxl là tốt nhất.

Cuốn sách miễn phí Tự động hóa các công cụ nhàm chán với Python có một chương về openpyxl với nhiều chi tiết hơn hoặc bạn có thể kiểm tra Đọc tài liệu trang web . Bạn sẽ không cần cài đặt Office hoặc Excel để sử dụng openpyxl.

Chương trình của bạn sẽ trông giống như thế này:

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

Tôi gặp lỗi khi nói: không thể chuyển đổi
int64

11

CSV là viết tắt của các giá trị được phân tách bằng dấu phẩy. CSV giống như một tệp văn bản và có thể được tạo đơn giản bằng cách thêm phần mở rộng .CSV

ví dụ viết mã này:

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

bạn có thể mở tập tin này với excel.


5
Bạn không thể định dạng nền cột bằng CSV. Nó chỉ là một định dạng dữ liệu để nhập và xuất.
Michael Dillon

5
Bạn có thể muốn sử dụng mô-đun csv có trong thư viện tiêu chuẩn nếu bạn sẽ làm điều này. Nó xử lý trích dẫn tốt hơn, ví dụ.
Flimm

@Flimm làm thế nào để tôi đơn giản viết vào các ô khác nhau?
oldboy

nếu bạn đang sử dụng Python 3 và tệp chứa các ký tự không phải ASCII, như éhoặc , tốt nhất bạn nên thực hiện f.write('\xEF\xBB\xBF')ngay sau open(). Đó là BOM ( dấu thứ tự byte , qv), cần thiết bởi phần mềm của Microsoft để nhận dạng mã hóa 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

Hãy thử xem các thư viện sau đây:

xlwings - để lấy dữ liệu vào và ra khỏi bảng tính từ Python, cũng như thao tác với sổ làm việc và biểu đồ

ExcelPython - một bổ trợ Excel để viết các hàm do người dùng định nghĩa (UDF) và các macro trong Python thay vì VBA


2

OpenPyxl là một thư viện đẹp, được xây dựng để đọc / ghi tệp Excel 2010 xlsx / xlsm:

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

Câu trả lời khác , đề cập đến nó là sử dụng hàm deperciated ( get_sheet_by_name). Đây là cách để làm điều đó mà không có nó:

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
Mã trên tạo ra lỗiFileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Atinesh

@Atinesh - Cảm ơn bạn đã phản hồi - openpyxl.load_workbooktải một bảng tính, đã có sẵn. Tạo một tập tin New.xlsxđể tránh lỗi này.
Vityata

1
OK Cảm ơn bạn đã gợi ý
Atinesh

Lưu ý rằng openpyxl không hỗ trợ định dạng 'xls' cũ hơn.
Ti-mô-thê C. Quinn

2

Các xlsxwriter thư viện là rất tốt cho việc tạo ra .xlsxtập tin. Đoạn mã sau tạo một .xlsxtệp từ danh sách các ký tự trong khi nêu thứ tựtên được hiển thị :

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)

nhập mô tả hình ảnh ở đây


Lưu ý 1 - Tôi cố tình không trả lời cho trường hợp chính xác mà OP trình bày. Thay vào đó, tôi đang trình bày một giải pháp chung hơn IMHO mà hầu hết khách truy cập tìm kiếm. Tiêu đề của câu hỏi này được lập chỉ mục tốt trong các công cụ tìm kiếm và theo dõi nhiều lưu lượng truy cập

nhập mô tả hình ảnh ở đây

Lưu ý 2 - Nếu bạn không sử dụng Python3.6 hoặc mới hơn, hãy xem xét sử dụng OrderedDicttrong headers. Trước Python3.6, thứ tự trong dictkhông được bảo tồn.



0

Cách dễ nhất để nhập các số chính xác là thêm một số thập phân sau các số trong l1l2. Python diễn giải dấu thập phân này theo hướng dẫn từ bạn để bao gồm số chính xác. Nếu bạn cần giới hạn nó ở một số vị trí thập phân, bạn sẽ có thể tạo một lệnh in giới hạn đầu ra, một cái gì đó đơn giản như:

print variable_example[:13]

Sẽ giới hạn nó ở vị trí thập phân thứ mười, giả sử dữ liệu của bạn có hai số nguyên còn lại của số thập phân.


0

Bạn có thể thử hfexcel thư viện python hướng đối tượng Nhân thân dựa trên 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

Nếu nhu cầu của bạn là sửa đổi một sổ làm việc hiện có, cách an toàn nhất là sử dụng pyoo . Bạn cần cài đặt một số thư viện và phải mất vài vòng để nhảy qua nhưng sau khi được thiết lập, nó sẽ có khả năng chống đạn khi bạn tận dụng API của LibreOffice / OpenOffice rộng và chắc chắn.

Vui lòng xem Gist của tôi về cách thiết lập hệ thống linux và thực hiện một số mã hóa cơ bản bằng pyoo.

Đây là một ví dụ về mã:

#!/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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.