在Excel中调整单元格宽度

41

我在使用xlsxwriter将内容写入Excel表格。我遇到了一个问题:当文本超出单元格大小时,它会被隐藏。

import xlsxwriter

workbook = xlsxwriter.Workbook("file.xlsx")
worksheet1 = workbook.add_worksheet()

worksheet1.write(1, 1,"long text hidden test-1" )
worksheet1.write(2, 1,"long text hidden test-2")
worksheet1.write(3, 1,"short-1")
worksheet1.write(4, 1,"short-2")
worksheet1.write(1, 2,"Hello world" )
worksheet1.write(2, 2,"Hello world")
worksheet1.write(3, 2,"Hello world")
worksheet1.write(4, 2,"Hello world")

workbook.close()

我得到的是什么

输入图像说明

我希望调整宽度后得到的是什么

输入图像说明

5个回答

66

您可以按照以下方式使用set_column

worksheet1.set_column(1, 1, 25)

定义如下:

set_column(first_col, last_col, width, cell_format, options)

你需要确定一个适当的宽度,可能基于整个列中最长文本的长度。但需要注意基于使用的字体和大小来确定宽度。同时还要考虑是否使用比例或固定宽度字体。

如果您想自动适应所有列,而不考虑字体和大小,则需要使用以下win32com接口:

import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(r'file.xlsx')
ws = wb.Worksheets("Sheet1")
ws.Columns.AutoFit()
wb.Save()
excel.Application.Quit()

在使用您当前的xlsxwriter代码关闭文件后,这可以很容易地完成。请注意,您可能需要提供文件的完整路径。


2
很好,win32com 解决方案非常完美。谢谢! - Walt Reed
1
如何在不打开Excel的情况下自动调整大小?将其后台打开会更好。 - Mithril
1
对我来说,它通常是隐藏的,但你可以尝试添加 excel.Visible = False - Martin Evans

20

很遗憾,xlsxwriter没有提供自适应大小的选项。

但是您可以跟踪每列中最大的条目,然后使用设置列命令在最后设置列宽度。

set_column(first_col, last_col, width, cell_format, options)

例如,在您的情况下,您应该将B列的宽度设置为最长字符串的长度。

width= len("long text hidden test-1")
worksheet1.set_column(1, 1, width)

如何获取列中最大的实体?有什么线索吗? - Ravichandra
1
假设您从某个数据集中获取数据并将其写入Excel表格。您可以解析数据集以获取最大字符串长度并将其设置为宽度。更具体的答案需要更多信息。 - Fahad Sarfraz
如果你正在使用 pandas 的数据框,你可以使用以下代码获取最长文本的长度:width = pd.Series(df.columns).str.len().max()。 - Abimael Domínguez
4
xlxwriter 现在具有自适应特性。您可以只需使用 sheet.autofit() 即可。 - Mehdi Zare

3
以下方法对我有用,使用df可以找到每列的最大宽度,并进行相应调整,就像这里建议的那样:在xslxwriter中模拟自适应调整列宽
def get_col_widths(dataframe):
    # First we find the maximum length of the index column   
    idx_max = max([len(str(s)) for s in dataframe.index.values] + [len(str(dataframe.index.name))])
    # Then, we concatenate this to the max of the lengths of column name and its values for each column, left to right
    return [idx_max] + [max([len(str(s)) for s in dataframe[col].values] + [len(col)]) for col in dataframe.columns]

for i, width in enumerate(get_col_widths(dataframe)):
    worksheet.set_column(i, i, width)

1
将@Mehdi Zare的评论作为答案添加,因为我几乎是手动实现的。 xlsxwriter现在包含工作表的autofit方法。 sheet.autofit()可能对你来说已经足够了。不过有一些限制。方法文档:https://xlsxwriter.readthedocs.io/worksheet.html#worksheet-autofit 关于限制,请阅读文档的描述:

xlsx文件格式中没有可以用来在加载时自动调整列宽的选项。列宽的自动调整是Excel在运行时完成的,当它可以访问所有的工作表信息以及基于字体和格式的Windows函数来计算显示区域时。

这是一种模拟方法,可能在某些情况下不准确。 它基于默认字体和字号Calibri 11。对于其他字体或字号,它将无法给出准确的结果。

autofit()方法不会覆盖使用set_column()或set_column_pixels()设置的用户定义列宽,如果它大于自适应值。这允许用户为列设置最小宽度值。
您还可以在autofit()之后调用set_column()和set_column_pixels()来覆盖任何计算出的值。
文档中还有一个示例:https://xlsxwriter.readthedocs.io/example_autofit.html 示例代码如下:
#######################################################################
# copied from the docs
#######################################################################

from xlsxwriter.workbook import Workbook

workbook = Workbook("autofit.xlsx")
worksheet = workbook.add_worksheet()

# Write some worksheet data to demonstrate autofitting.
worksheet.write(0, 0, "Foo")
worksheet.write(1, 0, "Food")
worksheet.write(2, 0, "Foody")
worksheet.write(3, 0, "Froody")

worksheet.write(0, 1, 12345)
worksheet.write(1, 1, 12345678)
worksheet.write(2, 1, 12345)

worksheet.write(0, 2, "Some longer text")

worksheet.write(0, 3, "http://ww.google.com")
worksheet.write(1, 3, "https://github.com")

# Autofit the worksheet.
worksheet.autofit()

workbook.close()

0
如果数据是动态的,列的长度不固定,您可以使用这个。
   last_column = 100 // you might increase it
   for column in dataframe:
       column_width = 40 // width
       col_idx = dataframe.columns.get_loc(column)
       writer.sheets['yourheets'].set_column(col_idx, last_column, column_width)
   writer.save()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接