我有多个带有空单元格的 .xlsx 文件,我需要使用空字符串。当我手动执行此操作时,我只是在每个单元格中添加一个单引号,这使单元格保持为空,但将其设置为字符串。我想用 python (和 openpyxl 模块)自动化这个过程,但我不能完全正确。我尝试输入空字符串和输入单引号,但由于不同的原因都失败了。
这是我的第一次尝试:
...
for row in range(2, sheet.max_row + 1):
for column in range(1, sheet.max_column + 1):
cell = sheet.cell(row=row, column=column)
# fixes cells with no value
if cell.value == None:
cell.value = ''
...
wb.save('new_file_name.xlsx')
在保存之前的运行过程中,值的类型为 NoneType 并且已成功更改为 str,但保存函数创建的新文件已将空字符串恢复为空单元格,即使是我手动执行的操作也是如此。
我的第二次尝试是插入单引号:
...
for row in range(2, sheet.max_row):
for column in range(1, sheet.max_column):
cell = sheet.cell(row=row, column=column)
# fixes cells with no value
if cell.value == None:
cell.value = '\''
...
wb.save('new_file_name.xlsx')
此尝试生成了一个 Excel 文件,其中每个空单元格都被单引号替换,但引号仍然显示,这与手动插入单引号不同,这意味着它不是空的。
有没有办法在 excel 中使用 python 将空单元格定义为字符串?
在官方问题跟踪器这里“讨论”这个问题之后,我得到的最接近的解决方案是:
当写入文件时 - 不要保存空字符串,而是保存 Excel 计算结果为空字符串的公式
=""
。这对于我的用例来说已经足够好了。我希望它也适合你。
如果我理解你的确切用例,你真正需要的是(假设你正在加载 data_only=False,默认值):
if cell.value == '': # this catches empty strings created by typing ' in the formula
cell.value = '=""'
请注意,编写公式时,openpyxl 不会计算它们,因此如果您打算稍后使用 data_only=True 加载此文件,则必须首先在 Excel 中打开该文件并保存。或者,您也可以使用 data_only=False 加载它,并使用
=""
公式检查单元格。
当阅读文件时 - 最好的选择是同时加载工作簿
data_only
= True
和 False
。在两个加载的工作簿中,空单元格的 .value
字段将是 None
。包含空字符串值的单元格应始终具有生成空字符串的公式(即使该公式是空字符串,就像您在 Excel 公式栏中键入 ' 时的情况一样)。
.data_type
字段还为您提供有关单元格中存储内容的有用信息。
一般来说,您应该参考我用一些常见用例制作的表,该表显示了加载和保存工作簿时数据如何更改(丢失):