openpyxl从.xlsx读取列宽并将其写入新的.xlsx:新文件中的宽度不同



我使用openpyxl处理Python中的.xlsx文件。

我有一个sample.xlsx文件,我想从中获得标题字段和列宽的列表,以便在脚本生成的文件中使用。

首先,我创建了一个包含列名及其相应宽度的列表。所以我使用:

filter_list = {"name": [], "width": []} 
row_count = sheet.max_row 
for i in range(row_count): 
cell = sheet.cell(row, i + 1) 
if cell.value: 
filter_list["name"].append(cell.value)
filter_list["width"].append(sheet.column_dimensions
[cell.column].width)  

值来获得列宽,然后我设置相同的值:

if filter_list["width"][i] is not None: 
sheet.column_dimensions[cell.column].width = filter_list["width"][i]

如果某个特定列具有非默认值(即非"无"),则工作正常。当我打开输出文件(在Mac和Windows上)时,我发现这两个文件的特定列的宽度是相同的。

但如果其中一列有。。。width=输入文件中的None(因此输出文件的列宽参数具有相同的None值)输出文件中的同一列看起来不同。

有什么想法吗?

.xlsx中似乎有一个参数,它以某种方式定义了默认宽度(=无值)的设置

有没有办法让两个文件在列宽方面看起来相同?

更新:我添加了对None宽度值的检查。我只为没有None值的列设置列宽参数。结果仍然是一样的——文件的默认宽度不同。

更新2:我已经更新了代码,以准确显示我是如何读取和设置列宽的。

如果列维度的宽度为None,Excel默认为0,而不是工作表的默认列宽。openpyxl试图通过在维度不存在的情况下创建维度来简化访问。因此,您的代码在两个文件中都创建了一些width=None,但只有在保存文件时,其效果才会显现出来。

在您的情况下,您应该能够通过明确处理第一个文件中的维度来避免问题:

for k, cd in ws1.column_dimensions.items():
ws2.column_dimensions[k].width = cd.width

回答第一位:不,不知道为什么会发生

但在回答第二个问题时,在我看来,它就像一样简单

if mywidth is not None:
output_sheet.column_dimensions['A'].width = mywidth

即在遍历所有列的循环中,只需检查列宽是否已实际定义。如果是,则将其应用于新的工作表,如果不是,则忽略它。

注意,它是column_dimensions(复数)而不是单一版本

编辑问题更新后:

Excel处理默认列宽的方式是在工作表级别。使用OpenXML工具查看了几个基本的Excel工作簿,然后与openpyxl文档进行了交叉引用,您可能会发现以下内容:

wb1 = load_workbook("my/workbook/name.xlsx")
ws1 = wb1.active
default_col_width = ws1.sheet_format.defaultColWidth

或者,打开新工作簿后,转到"Home"选项卡的"Cells"部分,单击"Format"按钮,选择"Default width..."并根据需要进行设置。

最新更新