Khi tôi muốn lưu trạng thái hiện tại của GANDAS DATAFRAME cho tiêu thụ thủ công trên mạng, tôi thường viết df.to_excel['foo.xlsx']
trong phiên ipython hoặc sổ ghi chép Jupyter của mình. Tuy nhiên, kiểu mặc định trông không đẹp và thường cần điều chỉnh thủ công [ví dụ: chiều rộng cột] để có thể sử dụng được.
Nếu bạn muốn tạo các báo cáo tùy chỉnh từ gấu trúc, do đó bạn có thể muốn theo chương trình kiểu này. Gói openpyxl thực hiện công việc này độc đáo. Dưới đây là một ví dụ động lực cho bạn thấy những cách cơ bản của API. Đầu tiên, có một số dữ liệu ngẫu nhiên:
import pandas as pd from io import StringIO df = pd.read_csv[StringIO["""\ alpha beta gamma 2000-01-01 -0.173215 0.119209 -1.044236 2000-01-02 -0.861849 -2.104569 -0.494929 2000-01-03 1.071804 0.721555 -0.706771 2000-01-04 -1.039575 0.271860 -0.424972 2000-01-05 0.567020 0.276232 -1.087401 2000-01-06 -0.673690 0.113648 -1.478427 2000-01-07 0.524988 0.404705 0.577046 2000-01-08 -1.715002 -1.039268 -0.370647 """], sep="\s+", parse_dates=True] output_filename = 'pandas-to-excel.xlsx'
Không tùy chỉnh
Chỉ để so sánh, xuất bản đơn giản của DataFrame sang bảng tính đầu tiên:
sheet_name = 'No customization' df.to_excel[output_filename, sheet_name]
Ít tùy chỉnh
Vì cột đầu tiên không thể đọc được với chiều rộng cột mặc định, chúng tôi tăng nhẹ. Đơn vị tương ứng với đơn vị chiều rộng cột Excel. Trên máy của tôi, bảng tính kết quả có chiều rộng cột là 20,29
with pd.ExcelWriter[ output_filename, mode='a', # append; default='w' [overwrite] engine='openpyxl'] as xlsx: sheet_name = 'Little customization' df.to_excel[xlsx, sheet_name] # set index column width ws = xlsx.sheets[sheet_name] ws.column_dimensions['A'].width = 21
Tùy chỉnh đầy đủ
Ví dụ động lực về những gì bạn có thể làm với một số thông số kỹ thuật khác, cụ thể là:
- Định dạng có điều kiện, ở đây với thang màu tùy chỉnh sử dụng phần trăm cho giới hạn dưới và trên [10%-90%], trong khi điểm giữa được xác định bởi giá trị [0 là màu trắng]. Các biểu tượng và thanh màu là cũng có thể, tất nhiên.
- Định dạng số, sử dụng cùng một cú pháp như trong đối thoại thuộc tính tế bào Excel. Tại đây, ngày chỉ số Cột Lốc bao gồm tên tuần được rút ngắn [MO-SU].
- Áp dụng một kiểu được xây dựng được đặt tên theo tên [tiêu đề 2] cho hàng tiêu đề.
- Tạo và áp dụng một kiểu tùy chỉnh được đặt tên [kiểu chỉ mục] bao gồm định dạng số, phông chữ và căn chỉnh.
Đầu tiên, các định nghĩa nhập khẩu và quy tắc/kiểu:
from openpyxl.formatting.rule import ColorScaleRule from openpyxl.styles import Alignment, Font, NamedStyle from openpyxl.utils import get_column_letter percentile_rule = ColorScaleRule[ start_type='percentile', start_value=10, start_color='ffaaaa', # red-ish mid_type='num', mid_value=0, mid_color='ffffff', # white end_type='percentile', end_value=90, end_color='aaffaa'] # green-ish # custom named style for the index index_style = NamedStyle[ name="Index Style", number_format='YYYY-MM-DD, DDD', font=Font[color='999999', italic=True], alignment=Alignment[horizontal='left']] # pass keyword args as dictionary writer_args = { 'path': output_filename, 'mode': 'a', 'engine': 'openpyxl'}
Cùng với đó, văn bản thực tế trông như thế này:
with pd.ExcelWriter[**writer_args] as xlsx: sheet_name = 'Full customization' df.to_excel[xlsx, sheet_name] ws = xlsx.sheets[sheet_name] # cell ranges index_column = 'A' value_cells = 'B2:{col}{row}'.format[ col=get_column_letter[ws.max_column], row=ws.max_row] title_row = '1' # index column width ws.column_dimensions[index_column].width = 21 # color all value cells ws.conditional_formatting.add[value_cells, percentile_rule] # for general styling, one has to iterate over # all cells individually for row in ws[value_cells]: for cell in row: cell.number_format = '0.00' # builtin or named styles can be applied by using # the style object or their name [shown below] for cell in ws[index_column]: cell.style = index_style # style title row last, so that headline style # wins over index style in top-left cell A1 for cell in ws[title_row]: cell.style = 'Headline 2'
Nếu bạn muốn ở trên trong một tập lệnh, hãy thử gist pandas-to-excel.py của tôi. Nó tạo ra một tệp excel duy nhất với ba bảng tính được đặt tên phù hợp.