openpyxl从阅读的.xlsx列宽并将其写入到一个新的.xlsx:宽度是在一个新的文件不同

问题描述 投票:0回答:2

我使用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在输入文件(以便输出文件具有用于列宽参数相同None值)在输出文件中同一列看起来不同。

关于为什么会发生什么想法吗?

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

有没有什么办法,使这两个文件看起来相同的列宽的条款?

更新:我添加了None的宽度值的检查。我只设置有不None值列的列宽参数。结果还是一样 - 文件在默认宽度方面不同。

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

python openpyxl xlsx
2个回答
1
投票

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

但在回答第二,在我看来是作为也很简单:

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

即,在通过所有列的循环只是检查列的宽度实际上是定义。如果将其应用到新的工作表,如果没有的话就忽视它。

NB是column_dimensions(复数)不是单一版本

编辑问题的更新后:

的方式,使用默认列宽的Excel交易是在工作表上的水平。说完看着一对夫妇使用OpenXML tools然后过与openpyxl docs参考基本的Excel工作簿的它似乎是你可能是以下后:

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

另外,一旦你已经打开了新的工作簿转到Home标签,Cells部分,单击Format按钮并选择Default width...并将其设置为你想要的。


0
投票

如果列维度具有None的宽度,Excel的默认0,而不是默认列宽的工作表。 openpyxl试图通过创建它们,如果它们不存在,使其易于访问的尺寸。所以,你的代码是创造一些与这两个文件width=None,但是当你保存文件这样的效果只有变得可见。

你的情况,你应该能够通过与第一个文件的尺寸明确努力避免的问题:

for k, cd in ws1.column_dimensions.items():
    ws2.column_dimensions[k].width = cd.width
© www.soinside.com 2019 - 2024. All rights reserved.