首页 > 解决方案 > openpyxl 从 .xlsx 读取列宽并将其写入新的 .xlsx:新文件中的宽度不同

问题描述

我正在使用 openpyxl.xlsx处理Python.

我有一个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 上)时,我看到这两个文件的特定列的宽度是相同的。

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

关于为什么会发生的任何想法?

看起来某处.xlsx有一个参数,它以某种方式定义了默认宽度(= None 值)设置为什么。

有没有办法让两个文件的列宽看起来一样?

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

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

标签: pythonopenpyxlxlsx

解决方案


如果列尺寸的宽度为None,则 Excel 默认0为工作表的默认列宽,而不是默认列宽。openpyxl 试图通过创建维度(如果它们不存在)来轻松访问它们。因此,您的代码width=None在两个文件中都创建了一些 with ,但是只有在保存文件时才会看到这种效果。

在您的情况下,您应该能够通过明确使用第一个文件中的尺寸来避免问题:

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

推荐阅读