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

时间:2019-01-30 08:17:20

标签: python openpyxl 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]

如果特定列具有非默认值(即非None),则可以正常工作。当打开输出文件(在Mac和Windows上)时,我看到两个文件的此特定列的宽度相同。

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

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

.xlsx中似乎有一个参数,该参数以某种方式定义了默认宽度(= None值)设置为什么。

有什么办法使两个文件的列宽看起来都一样?

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

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

2 个答案:

答案 0 :(得分:1)

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

但是在回答第二个问题时,在我看来似乎很简单:

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

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

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

修改问题更新之后:

Excel处理默认列宽的方法是在工作表级别。使用OpenXML tools查看了几本基本的Excel工作簿,然后使用openpyxl docs进行交叉引用,看来您可能会遵循以下条件:

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

或者,打开新工作簿后,转到Home标签的Cells部分,单击Format按钮,然后选择Default width...并将其设置为您想要。

答案 1 :(得分:0)

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

对于您而言,通过显式使用第一个文件中的尺寸,您应该能够避免出现问题:

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