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]
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
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.
Đã 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
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
Đị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
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
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']]
2Và 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
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
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
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
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']]
9Sau đó, 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
2Tuy 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
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
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