在 Excel 中调整单元格宽度

问题描述 投票:0回答:5

我正在使用 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()

我得到了什么

我对调整宽度的期望

python excel xlsxwriter
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 代码关闭文件后,可以轻松完成此操作。请注意,您可能需要提供文件的完整路径。


20
投票

不幸的是 xlsxwriter 不提供自动调整选项。

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

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

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

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

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)

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()

0
投票

添加@Mehdi Zare 的评论作为答案,因为我几乎是手动实现的。

xlsxwriter
现在包含
autofit
工作表方法。

sheet.autofit()
可能对你来说就足够了。顺便说一句,有一些限制。方法文档:https://xlsxwriter.readthedocs.io/worksheet.html#worksheet-autofit

有关限制,请阅读文档的描述:

xlsx 文件格式中没有可用于表示“加载时自动调整列”的选项。自动调整列是 Excel 在运行时执行的操作,此时 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()
© www.soinside.com 2019 - 2024. All rights reserved.