2013-05-17 35 views
5

Tôi đã viết một tệp Excel lớn và optimized writer trong openpyxl là những gì tôi cần.Đặt định dạng và kiểu ô bằng cách sử dụng Trình soạn thảo được tối ưu hóa trong openpyxl

Câu hỏi đặt ra là: có thể thiết lập kiểu và định dạng ô khi sử dụng trình ghi tối ưu không? Kiểu không quan trọng lắm (tôi chỉ muốn làm nổi bật tiêu đề cột), nhưng tôi cần định dạng số chính xác cho một số cột chứa giá trị tiền tệ. Tôi thấy rằng phương pháp ws.cell() không khả dụng khi sử dụng trình ghi được tối ưu hóa, vậy làm cách nào để thực hiện?

Cảm ơn bạn trước sự giúp đỡ của bạn!

Trả lời

4

Bạn cũng có thể xem mô-đun XlsxWriter cho phép viết các tệp lớn trong optimised mode với formatting.

from xlsxwriter.workbook import Workbook 

workbook = Workbook('file.xlsx', {'constant_memory': True}) 
worksheet = workbook.add_worksheet() 
... 
+0

Cảm ơn bạn vì một mô-đun tuyệt vời! Có bất kỳ điểm chuẩn hiệu suất openpyxl với 'optimization_write = True' vs xlsxwriter với' constant_memory = True'? – alecxe

+0

Các [PyExcelerate] (https://github.com/whitehat2k9/PyExcelerate) guys có điểm chuẩn trong [README] của họ (https://github.com/whitehat2k9/PyExcelerate/blob/master/README.md) cho PyExcelerate , XlsxWriter và OpenPyXL. – jmcnamara

+0

Cảm ơn bạn đã chia sẻ. Pyexcelerate trông đầy hứa hẹn về tốc độ, nhưng không có gì khác: không có định dạng ô, thiết lập trang, vv Hy vọng, xlsxwriter sẽ nhanh hơn trong các phiên bản sau. – alecxe

1

Trích dẫn từ tài liệu:

Những bảng chỉ có một phương pháp append(), nó không thể truy cập tế bào độc lập trực tiếp (thông qua di động() hoặc dải()). Họ là chỉ ghi.

Khi bạn vượt qua optimized_write=True để các nhà xây dựng Workbook, openpyxl sẽ sử dụng DumpWorksheet lớp thay vì Worksheet. Lớp DumpWorksheet rất hạn chế về kiểu dáng và định dạng.

Nhưng, hãy xem phương thức append - nó khớp với loại dữ liệu trăn bạn chuyển đến loại excel. Vì vậy, xem các định dạng tế bào đúng trong file kết quả sau khi chạy này:

import datetime 
from openpyxl import Workbook 

wb = Workbook(optimized_write=True) 
ws = wb.create_sheet() 

for irow in xrange(5): 
    ws.append([True, datetime.datetime.now(), 'test', 1, 1.25, '=D1+E1']) 

wb.save('output.xlsx') 

Phát biểu về việc thay đổi tiêu đề cột phong cách - chỉ cần không có cách nào để làm điều đó bằng văn được tối ưu hóa.

Hy vọng điều đó sẽ hữu ích.

1

Bạn có thể sử dụng WriteOnlyCell để thực hiện việc này.

from openpyxl import Workbook 
wb = Workbook(optimized_write = True) 
ws = wb.create_sheet() 
from openpyxl.writer.dump_worksheet import WriteOnlyCell 
from openpyxl.styles import Style, Font, PatternFill 
cell = WriteOnlyCell(ws, value="highlight") 
cell.style = Style(font=Font(name='Courier', size=36), fill=PatternFill(fill_type='solid',start_color='8557e5')) 
cols=[] 
cols.append(cell) 
cols.append("some other value") 
ws.append(cols) 
wb.save("test.xlsx") 

Tôi hy vọng điều này sẽ hữu ích. Bạn có thể sử dụng bất kỳ thứ gì mà kiểu sẽ cho phép trước khi thêm nó vào hàng cho trang tính.

2

Như tôi không thể bình luận, tôi sẽ đăng một bản cập nhật để Dean của câu trả lời ở đây:

api openpyxl của (phiên bản 2.4.7) đã thay đổi một chút để nó bây giờ sẽ đọc:

from openpyxl import Workbook 
wb = Workbook(write_only = True) 
ws = wb.create_sheet() 

from openpyxl.writer.dump_worksheet import WriteOnlyCell 
from openpyxl.styles import Font 

cell = WriteOnlyCell(ws, value="highlight") 
cell.font = Font(name='Courier', size=36) 

cols=[] 
cols.append(cell) 
cols.append("some other value") 
ws.append(cols) 
wb.save("test.xlsx") 

Hy vọng nó sẽ giúp

Các vấn đề liên quan