openpyxl - 调整列宽大小

新手上路,请多包涵

我有以下脚本将 CSV 文件转换为 XLSX 文件,但我的列大小非常窄。每次我都必须用鼠标拖动它们来读取数据。有人知道如何在 openpyxl 中设置列宽吗?

这是我正在使用的代码。

 #!/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)

原文由 Satish 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 769
2 个回答

您可以估计(或使用单宽字体)来实现此目的。假设数据是一个嵌套数组,例如

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

我们可以获得每列中的最大字符数。然后设置宽度。宽度正好是等宽字体的宽度(如果至少不改变其他样式的话)。即使您使用可变宽度字体,这也是一个不错的估计。这不适用于公式。

 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

有点 hack,但您的报告将更具可读性。

原文由 Bufke 发布,翻译遵循 CC BY-SA 4.0 许可协议

我对 Bufke 回答的变体。避免使用数组进行一些分支并忽略空单元格/列。

现在针对非字符串单元格值进行了修复。

 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

从 openpyxl 版本 3.0.3 开始,您需要使用

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

因为如果您传递 column_dimensions 数字而不是列字母,openpyxl 库将引发 TypeError,其他一切都可以保持不变。

原文由 velis 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏