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)
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)
一般来说,您希望列的宽度比列中最长字符串的大小大一点。xlsxwriter列的with of 1单位约等于一个字符的宽度。因此,可以通过将每个列设置为该列中的最大字符数来模拟自动调整。
例如,在使用pandas数据帧和xlsxwriter时,我倾向于使用下面的代码。
它首先查找索引的最大宽度,该宽度始终是pandas用于excel呈现数据帧的左列。然后,它返回所有值的最大值以及从左到右移动的其余每列的列名。
无论您使用的是什么样的数据,调整此代码应该不会太困难。
我同意科尔·戴蒙德的观点。我需要做一些非常相似的事情,这对我很好。其中self.columns是我的列列表
我最近遇到了同样的问题,这就是我的想法:
在我的示例中,
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文件上尝试过这个答案。如果您将有多行,则需要有一种方法来确定哪一行将具有“最长”信息,并仅将其应用于该行。但是,如果每一列的大小大致相同,而不考虑行数,那么这对您来说应该很好。
祝你好运,我希望这会有帮助!
相关问题 更多 >
编程相关推荐