在xslxwri中模拟自动调整列

2024-10-01 09:38:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python的xlsxwriter中模拟Excel autofit函数。根据此url,它不直接受支持: http://xlsxwriter.readthedocs.io/worksheet.html

但是,循环遍历工作表中的每个单元格并确定列的最大大小应该非常简单,只需使用工作表。设置列(行、列、宽度)即可设置宽度。

使我不能写这篇文章的复杂因素是:

  1. 该URL没有指定第三个参数设置列的单位。
  2. 我找不到方法来测量要插入单元格的项的宽度。
  3. xlsxwriter似乎没有读取特定单元格的方法。这意味着我在写单元格时需要跟踪每个单元格的宽度。如果我能循环遍历所有的单元,这样就可以编写一个通用的例程,那就更好了。

Tags: 方法函数iohttpurl宽度htmlreadthedocs
3条回答

一般来说,您希望列的宽度比列中最长字符串的大小大一点。xlsxwriter列的with of 1单位约等于一个字符的宽度。因此,可以通过将每个列设置为该列中的最大字符数来模拟自动调整。

例如,在使用pandas数据帧和xlsxwriter时,我倾向于使用下面的代码。

它首先查找索引的最大宽度,该宽度始终是pandas用于excel呈现数据帧的左列。然后,它返回所有值的最大值以及从左到右移动的其余每列的列名。

无论您使用的是什么样的数据,调整此代码应该不会太困难。

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)

我同意科尔·戴蒙德的观点。我需要做一些非常相似的事情,这对我很好。其中self.columns是我的列列表

def set_column_width(self):
    length_list = [len(x) for x in self.columns]
    for i, width in enumerate(length_list):
        self.worksheet.set_column(i, i, width)

我最近遇到了同样的问题,这就是我的想法:

r = 0
c = 0
for x in list:
    worksheet.set_column('{0}:{0}'.format(chr(c + ord('A'))), len(str(x)) + 2)
    worksheet.write(r, c, x)
    c += 1

在我的示例中,r将是您要输出到的行号,c将是您要输出到的列号(均为0索引),而x将是您要在单元格中的list中的值。

'{0}:{0}'.format(chr(c + ord('A')))片段获取提供的列号并将其转换为xlsxwriter接受的列字母,因此如果c = 0{}将看到'A:A',如果c = 1,则它将看到'B:B',依此类推。

len(str(x)) + 2部分确定要输出的字符串的长度,然后向其中添加2,以确保excel单元格足够宽,因为字符串的长度与单元格的宽度不完全相关。您可能想玩,而不是添加2或更多取决于您的数据。

xlsxwriter接受的单位有点难以解释。当您在excel中并将鼠标悬停在可以更改列宽的位置时,您将看到Width: 8.43 (64 pixels)。在这个例子中,它接受的单位是8.43,我认为是厘米?但excel甚至没有提供一个单元,至少没有显式地提供。

注意:我只在包含一行数据的excel文件上尝试过这个答案。如果您将有多行,则需要有一种方法来确定哪一行将具有“最长”信息,并仅将其应用于该行。但是,如果每一列的大小大致相同,而不考虑行数,那么这对您来说应该很好。

祝你好运,我希望这会有帮助!

相关问题 更多 >