我使用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...
"并根据需要进行设置。