Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

129

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi có tập lệnh sau đây đang chuyển đổi tệp CSV thành tệp XLSX, nhưng kích thước cột của tôi rất hẹp. Mỗi lần tôi phải kéo chúng bằng chuột để đọc dữ liệu. Có ai biết cách đặt chiều rộng cột trong

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
7 không?

Đây là mã tôi đang sử dụng.

#!/usr/bin/python2.6
import csv
from openpyxl import Workbook
from openpyxl.cell import get_column_letter

f = open('users_info_cvs.txt', "rU")

csv.register_dialect('colons', delimiter=':')

reader = csv.reader(f, dialect='colons')

wb = Workbook()
dest_filename = r"account_info.xlsx"

ws = wb.worksheets[0]
ws.title = "Users Account Information"

for row_index, row in enumerate(reader):
    for column_index, cell in enumerate(row):
        column_letter = get_column_letter((column_index + 1))
        ws.cell('%s%s'%(column_letter, (row_index + 1))).value = cell

wb.save(filename = dest_filename)

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Yaron

9.7968 Huy hiệu vàng44 Huy hiệu bạc59 Huy hiệu Đồng8 gold badges44 silver badges59 bronze badges

Đã hỏi ngày 2 tháng 11 năm 2012 lúc 14:50Nov 2, 2012 at 14:50

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

1

Bạn có thể ước tính (hoặc sử dụng phông chữ Mono Width) để đạt được điều này. Giả sử dữ liệu là một mảng lồng nhau như

[['a1','a2'],['b1','b2']]

Chúng ta có thể nhận các ký tự tối đa trong mỗi cột. Sau đó đặt chiều rộng thành đó. Chiều rộng chính xác là chiều rộng của phông chữ đơn vị (nếu không thay đổi các kiểu khác ít nhất). Ngay cả khi bạn sử dụng phông chữ có chiều rộng biến thì đó là một ước tính tốt. Điều này sẽ không hoạt động với các công thức.

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width

Một chút hack nhưng báo cáo của bạn sẽ dễ đọc hơn.

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Đã trả lời ngày 22 tháng 1 năm 2013 lúc 2:20Jan 22, 2013 at 2:20

BufkebufkeBufke

2.9353 huy hiệu vàng27 Huy hiệu bạc27 Huy hiệu đồng3 gold badges27 silver badges27 bronze badges

6

Biến thể của tôi về câu trả lời của Bufke. Tránh một chút phân nhánh với mảng và bỏ qua các ô / cột trống.

Bây giờ cố định cho các giá trị ô không chuỗi.

ws = your current worksheet
dims = {}
for row in ws.rows:
    for cell in row:
        if cell.value:
            dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value))))    
for col, value in dims.items():
    ws.column_dimensions[col].width = value

Kể từ OpenPyxl phiên bản 3.0.3, bạn cần sử dụng

 dims[cell.column_letter] = max((dims.get(cell.column_letter, 0), len(str(cell.value))))

Vì thư viện OpenPyXL sẽ tăng một kiểu mẫu nếu bạn vượt qua

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
8 một số thay vì một chữ cái cột, mọi thứ khác có thể giữ nguyên.

Đã trả lời ngày 4 tháng 3 năm 2016 lúc 7:33Mar 4, 2016 at 7:33

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Velisvelisvelis

7.7314 Huy hiệu vàng43 Huy hiệu bạc59 Huy hiệu Đồng4 gold badges43 silver badges59 bronze badges

1

Thậm chí nhiều cách pythonic hơn để đặt chiều rộng của tất cả các cột hoạt động ít nhất trong phiên bản openpyxl 2.4.0:

for column_cells in worksheet.columns:
    length = max(len(as_text(cell.value)) for cell in column_cells)
    worksheet.column_dimensions[column_cells[0].column].width = length

Hàm AS_TEXT phải là thứ chuyển đổi giá trị thành chuỗi độ dài phù hợp, như đối với Python 3:

def as_text(value):
    if value is None:
        return ""
    return str(value)

Đã trả lời ngày 2 tháng 12 năm 2016 lúc 15:03Dec 2, 2016 at 15:03

User3759685User3759685User3759685

6335 Huy hiệu bạc6 Huy hiệu Đồng5 silver badges6 bronze badges

9

Với OpenPyXL 3.0.3 Cách tốt nhất để sửa đổi các cột là với đối tượng DimensionHolder, đây là từ điển ánh xạ từng cột thành một đối tượng cột. CộtDimension có thể nhận các tham số là BestFit, Auto_Size (là bí danh của BestFit) và chiều rộng. Cá nhân, auto_size không hoạt động như mong đợi và tôi phải sử dụng chiều rộng và nhận ra rằng chiều rộng tốt nhất cho cột là

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
9.

Để có được giá trị của mỗi ô, cần phải lặp lại từng ô, nhưng cá nhân tôi đã không sử dụng nó vì trong dự án của tôi, tôi chỉ phải viết bảng tính, vì vậy tôi đã có chuỗi dài nhất trong mỗi cột trực tiếp trên dữ liệu của mình.

Ví dụ dưới đây chỉ hiển thị cách sửa đổi kích thước cột:

import openpyxl
from openpyxl.worksheet.dimensions import ColumnDimension, DimensionHolder
from openpyxl.utils import get_column_letter

wb = openpyxl.load_workbook("Example.xslx")
ws = wb["Sheet1"]

dim_holder = DimensionHolder(worksheet=ws)

for col in range(ws.min_column, ws.max_column + 1):
    dim_holder[get_column_letter(col)] = ColumnDimension(ws, min=col, max=col, width=20)

ws.column_dimensions = dim_holder

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Địa phương

2.7162 Huy hiệu vàng22 Huy hiệu bạc32 Huy hiệu Đồng2 gold badges22 silver badges32 bronze badges

Đã trả lời ngày 22 tháng 3 năm 2020 lúc 16:12Mar 22, 2020 at 16:12

G.I. Jackg.i. JackG.I. Jack

2913 Huy hiệu bạc3 Huy hiệu Đồng3 silver badges3 bronze badges

1

Tôi có một vấn đề với Merged_Cells và Autosize không hoạt động chính xác, nếu bạn có cùng một vấn đề, bạn có thể giải quyết với mã tiếp theo:

for col in worksheet.columns:
    max_length = 0
    column = col[0].column # Get the column name
    for cell in col:
        if cell.coordinate in worksheet.merged_cells: # not check merge_cells
            continue
        try: # Necessary to avoid error on empty cells
            if len(str(cell.value)) > max_length:
                max_length = len(cell.value)
        except:
            pass
    adjusted_width = (max_length + 2) * 1.2
    worksheet.column_dimensions[column].width = adjusted_width

Đã trả lời ngày 24 tháng 4 năm 2017 lúc 23:26Apr 24, 2017 at 23:26

VirakovirakoVirako

65010 Huy hiệu bạc17 Huy hiệu đồng10 silver badges17 bronze badges

Một cải tiến nhỏ của câu trả lời được chấp nhận trên, mà tôi nghĩ là Pythonic hơn (yêu cầu tha thứ là tốt hơn là xin phép)

column_widths = []
for row in workSheet.iter_rows():
    for i, cell in enumerate(row):
        try:
            column_widths[i] = max(column_widths[i], len(str(cell.value)))
        except IndexError:
            column_widths.append(len(str(cell.value)))

for i, column_width in enumerate(column_widths):
    workSheet.column_dimensions[get_column_letter(i + 1)].width = column_width

Đã trả lời ngày 17 tháng 10 năm 2016 lúc 12:50Oct 17, 2016 at 12:50

Shaystshaystshayst

2674 Huy hiệu bạc13 Huy hiệu Đồng4 silver badges13 bronze badges

3

Chúng ta có thể chuyển đổi số thành giá trị ASCII của chúng và đưa nó sang tham số Cột_Dimension

[['a1','a2'],['b1','b2']]
0

Đã trả lời ngày 20 tháng 6 năm 2019 lúc 6:31Jun 20, 2019 at 6:31

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Dưới đây là một giải pháp đơn giản, tổng quát hơn cho người dùng mới về chủ đề (không được chỉ định cho câu hỏi).

Nếu bạn muốn thay đổi chiều rộng hoặc chiều cao của các ô trong

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
7 (phiên bản 3.0.9), bạn có thể làm điều đó chỉ bằng cách gán các thuộc tính của các ô với
ws = your current worksheet
dims = {}
for row in ws.rows:
    for cell in row:
        if cell.value:
            dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value))))    
for col, value in dims.items():
    ws.column_dimensions[col].width = value
1 hoặc
from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
8.

[['a1','a2'],['b1','b2']]
1

Đã trả lời ngày 23 tháng 3 lúc 10:47Mar 23 at 10:47

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

JadeljadelJAdel

1.3415 huy hiệu bạc17 Huy hiệu đồng5 silver badges17 bronze badges

Đây là phiên bản của tôi giới thiệu đoạn mã mã của @virako

[['a1','a2'],['b1','b2']]
2

Và cách sử dụng như sau,

[['a1','a2'],['b1','b2']]
3

Đã trả lời ngày 15 tháng 5 năm 2019 lúc 2:48May 15, 2019 at 2:48

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Alonesalonealones

2.8282 Huy hiệu vàng26 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges26 silver badges30 bronze badges

Tất cả các câu trả lời trên đang tạo ra một vấn đề là Col [0] .Column đang trả về số trong khi bảng tính.column_dimensions [cột] chỉ chấp nhận ký tự như 'a', 'b', 'c' thay thế cho cột. Tôi đã sửa đổi mã của @Virako và bây giờ nó đang hoạt động tốt.

[['a1','a2'],['b1','b2']]
4

Đã trả lời ngày 29 tháng 5 năm 2019 lúc 4:29May 29, 2019 at 4:29

1

Đây là một sửa chữa bẩn. Nhưng OpenPyXL thực sự hỗ trợ

ws = your current worksheet
dims = {}
for row in ws.rows:
    for cell in row:
        if cell.value:
            dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value))))    
for col, value in dims.items():
    ws.column_dimensions[col].width = value
3. Nhưng không có phương pháp nào để truy cập vào tài sản.

[['a1','a2'],['b1','b2']]
5

Đã trả lời ngày 22 tháng 10 năm 2020 lúc 16:39Oct 22, 2020 at 16:39

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Han Luohan LuoHan Luo

1883 Huy hiệu bạc4 Huy hiệu đồng3 silver badges4 bronze badges

0

Một cách tiếp cận khác mà không lưu trữ bất kỳ trạng thái nào có thể như thế này:

[['a1','a2'],['b1','b2']]
6

Đã trả lời ngày 4 tháng 2 lúc 12:56Feb 4 at 12:56

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Tôi đã phải thay đổi @user3759685 câu trả lời ở trên cho điều này khi OpenPxyl được cập nhật. Tôi đã bị lỗi. Vâng @phihag cũng đã báo cáo điều này trong các ý kiến

[['a1','a2'],['b1','b2']]
7

Đã trả lời ngày 24 tháng 8 năm 2019 lúc 0:44Aug 24, 2019 at 0:44

Monte Jonesmonte JonesMonte Jones

1.0317 Huy hiệu bạc3 Huy hiệu đồng7 silver badges3 bronze badges

Biên dịch và áp dụng nhiều đề xuất ở trên và mở rộng các ô được hợp nhất chỉ phát hiện ra các ô được hợp nhất theo chiều ngang, tôi có thể cung cấp mã này:

[['a1','a2'],['b1','b2']]
8

Đã trả lời ngày 7 tháng 7 năm 2021 lúc 17:01Jul 7, 2021 at 17:01

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

Sau khi cập nhật từ OpenPyXL2.5.2a lên 2.6.4 mới nhất (phiên bản cuối cùng cho hỗ trợ Python 2.x), tôi đã gặp sự cố tương tự trong việc định cấu hình chiều rộng của một cột.

Về cơ bản, tôi luôn tính toán chiều rộng cho một cột (DIMS là một chế độ duy trì từng chiều rộng cột):

[['a1','a2'],['b1','b2']]
9

Sau đó, tôi đang sửa đổi thang đo thành một cái gì đó sớm hơn kích thước ban đầu, nhưng bây giờ bạn phải đưa ra giá trị "chữ" của một cột và không còn là giá trị int (col bên dưới là giá trị và được dịch thành chữ cái bên phải):

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
0

Điều này sẽ khắc phục lỗi có thể nhìn thấy và gán chiều rộng phù hợp với cột của bạn;) Hy vọng điều này giúp đỡ.

Đã trả lời ngày 11 tháng 11 năm 2019 lúc 9:38Nov 11, 2019 at 9:38

Marco Smdmmarco SMDMMarco smdm

9921 Huy hiệu vàng13 Huy hiệu bạc24 Huy hiệu đồng1 gold badge13 silver badges24 bronze badges

Tôi đã tạo một chức năng rất nhanh với các tệp excel lớn vì nó sử dụng pandas.read_excel

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
1

Đã trả lời ngày 26 tháng 5 năm 2021 lúc 17:22May 26, 2021 at 17:22

AngelangelAngel

1.07512 huy hiệu bạc26 Huy hiệu đồng12 silver badges26 bronze badges

Khi điều này xuất hiện cho tôi, tôi chỉ làm mọi thứ tôi muốn làm với OpenPyXL, lưu sổ làm việc và mở nó lại với Pywin32. PyWin32 có ô tô tích hợp mà không phải thực hiện một loạt các quy tắc/điều kiện.

Chỉnh sửa: Tôi nên lưu ý rằng PyWin32 chỉ hoạt động với Windows.

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
2

Tuy nhiên, tôi đã thêm một quy tắc vì tôi có một cột văn bản có một số giá trị dài mà tôi không cần phải hiển thị. Tôi giới hạn bất kỳ cột nào ở 75 ký tự.

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
3

Đã trả lời ngày 24 tháng 6 năm 2021 lúc 15:40Jun 24, 2021 at 15:40

bpw1009bpw1009bpw1009

891 Huy hiệu bạc4 Huy hiệu đồng1 silver badge4 bronze badges

2

Chỉ cần chèn dòng mã bên dưới trong tệp của bạn

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
4

Đã trả lời ngày 11 tháng 8 lúc 10:03Aug 11 at 10:03

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

MouneshmouneshMounesh

3172 Huy hiệu bạc10 Huy hiệu đồng2 silver badges10 bronze badges

Dưới đây là câu trả lời cho Python 3.8 và OpenPyXL 3.0.0.

Tôi đã cố gắng tránh sử dụng chức năng

ws = your current worksheet
dims = {}
for row in ws.rows:
    for cell in row:
        if cell.value:
            dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value))))    
for col, value in dims.items():
    ws.column_dimensions[col].width = value
4 nhưng không thành công.

Giải pháp này sử dụng các biểu thức gán mới được giới thiệu hay còn gọi là "Toán tử Walrus":

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
5

Đã trả lời ngày 2 tháng 11 năm 2019 lúc 2:19Nov 2, 2019 at 2:19

DMMFLLDMMFLLdmmfll

2.6062 Huy hiệu vàng33 Huy hiệu bạc40 Huy hiệu đồng2 gold badges33 silver badges40 bronze badges

2

Vì trong OpenPyxl 2.6.1, nó yêu cầu chữ cái cột, không phải số cột, khi đặt chiều rộng.

from openpyxl.utils import get_column_letter

column_widths = []
for row in data:
    for i, cell in enumerate(row):
        if len(column_widths) > i:
            if len(cell) > column_widths[i]:
                column_widths[i] = len(cell)
        else:
            column_widths += [len(cell)]
    
for i, column_width in enumerate(column_widths,1):  # ,1 to start at 1
    worksheet.column_dimensions[get_column_letter(i)].width = column_width
6

Đã trả lời ngày 27 tháng 11 năm 2020 lúc 13:31Nov 27, 2020 at 13:31

Hướng dẫn how to set column width in excel using python openpyxl - cách đặt chiều rộng cột trong excel bằng python openpyxl

DàchúndàchúnDàChún

4.5711 Huy hiệu vàng35 Huy hiệu bạc39 Huy hiệu đồng1 gold badge35 silver badges39 bronze badges

Làm cách nào để thay đổi chiều rộng của một cột trong Excel bằng OpenPyXL?

Để thay đổi kích thước chiều rộng cột, bạn có thể sử dụng phương thức cột_dimesnsions của lớp bảng tính.make use of the column_dimesnsions method of the worksheet class.

Làm cách nào để tự động điều chỉnh chiều rộng cột trong Excel bằng Python?

Cách dễ nhất để tự động kích thước chiều rộng và chiều cao của cột là gọi phương thức AutofitColumn của lớp bảng tính. Phương thức AutofitColumn lấy chỉ mục cột (của cột sắp được thay đổi kích thước) làm tham số. Sao chép def autofit_column (self): \# khởi tạo một đối tượng sổ làm việc bởi excel file pathbook = self.call the Worksheet class' autoFitColumn method. The autoFitColumn method takes the column index (of the column about to be resized) as a parameter. Copy def autofit_column(self): \# Instantiating a Workbook object by excel file path workbook = self.

Làm cách nào để định dạng một ô trong Excel bằng OpenPyXL?

Chúng ta hãy xem chương trình sau:..
nhập openpyxl ..
WB = OpenPyxl.load_workbook ('Marks. xlsx').
Tờ = WB.tích cực..
ô = tấm ['a1', 'b7'].
# Các tế bào hoạt động như toán tử phạm vi ..
Đối với I1, I2 trong các tế bào:.
print ("{0: 8} {1: 8}". định dạng (i1. value, i2. value)).

OpenPyXL có thể hoạt động với XLS không?

OpenPyXL là một thư viện Python để đọc và ghi các tệp Excel (với phần mở rộng XLSX/XLSM/XLTX/XLTM).Mô -đun OpenPyXL cho phép chương trình Python đọc và sửa đổi các tệp Excel.. The openpyxl module allows Python program to read and modify Excel files.