python - 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:我更新了代码以准确显示我如何读取和设置列宽。
解决方案
如果列尺寸的宽度为None
,则 Excel 默认0
为工作表的默认列宽,而不是默认列宽。openpyxl 试图通过创建维度(如果它们不存在)来轻松访问它们。因此,您的代码width=None
在两个文件中都创建了一些 with ,但是只有在保存文件时才会看到这种效果。
在您的情况下,您应该能够通过明确使用第一个文件中的尺寸来避免问题:
for k, cd in ws1.column_dimensions.items():
ws2.column_dimensions[k].width = cd.width
推荐阅读
- python - 多处理挂起 requests.get
- google-apps-script - Google App Script:在 Main 函数完成之前执行的调用函数
- python - 对于神经网络(pytorch)中的每一层,应该有多少偏差?
- django - Docker django 仅在我指定命令时运行
- c++ - “你好三角形”没有显示。是否有一些功能没有正确使用?
- javascript - 在 HTML 页面上显示通过 javascript 派生的 HTML Slider 变量
- c# - 计算importIVA是坏的
- javascript - 尝试在 React/TypeScript 应用程序中使用 usetState 时应用程序中断
- c++ - i2c 错误:“i2c_smbus_read_byte_data”未在此范围内声明
- c# - 如何修复“不知道 xamarin.forms.view”创建表?