我正在使用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:我已经更新了代码,以准确显示我如何读取和设置列宽。
答案 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