在我的这篇文章中最初描述的以编程方式突出显示 openpyxl 中的单元格时,我遇到了奇怪的行为。我花了一些(更多)时间对此进行调查并设法跟踪此错误的来源。我不知道这是否是重现它的唯一方法,也许某些步骤是不必要的,但以下示例代码最接近我实际所做的:
import openpyxl
def doStuff(iterations=1, fName='test'):
for i in range(iterations):
wb = openpyxl.reader.excel.load_workbook(fName+'.xlsx')
ws=wb.get_active_sheet()
a1=ws.cell('A1')
a1.style.fill.fill_type=openpyxl.style.Fill.FILL_SOLID
a1.style.fill.start_color.index='0000CC'
namedRanges=wb.get_named_ranges()
for namedRange in namedRanges:
if namedRange.name in 'myName':
desiredNamedRange=namedRange
dest=desiredNamedRange.destinations
namedCell=ws.cell(dest[0][2].split('$')[1]+dest[0][3].split('$')[2])
namedCell.style.fill.fill_type=openpyxl.style.Fill.FILL_SOLID
namedCell.style.fill.start_color.index='FF33CC'
wb.save(fName+'.xlsx')
会发生什么是我打开一个已经存在的工作簿,其中包含一些值(数字和文本)。数字位于我稍后将突出显示的单元格中(A1和名为“myName”的单元格,在我的测试用例中为E7 ),而文本位于相邻列中。然后我用一些颜色填充A1和命名单元格并保存工作簿。如果需要,可以重复多次(以模拟我的原始代码的长时间使用)。
第一次运行后,一切正常,如您所料。首次运行后,当您在 Excel 中打开工作簿,将“无填充”应用于其中包含A1的单元格区域并关闭工作簿时,会出现问题,同时仍保持这些单元格处于选中状态。当您再次以 10 或 20 次迭代运行我的代码时,您会注意到,当您在 Excel 中打开测试工作簿时,您最初选择的单元格区域现在突出显示为与A1相同的颜色。
我的问题是:
我在这里做错了吗?该程序的性质要求它多次执行此过程,我不能禁止用户关闭选定单元格的工作簿。
有什么办法可以防止这种情况发生吗?如果是,该怎么做?
额外信息
我查看了构成工作簿的 XML 文件,我在其中观察到了这种行为(有关标准,请参阅此网站)。我注意到,由于某些原因,当您在使用openpyxl
更改格式时选择它们时,单元格样式参考会发生变化。例如,单元格B1
(字母s
)的样式应为 0(或不存在,因为默认情况下假定为 0),而在工作簿上运行上述代码时将openpyxl
其更改为:1
<c r="A1" s="1">
<v>1</v>
</c>
<c r="B1" s="1" t="s">
<v>0</v>
</c>
这会导致单元格样式发生变化。我非常怀疑我在这里做错了什么,所以:
我的新问题是:模块的
哪个部分openpyxl
最有可能对此负责?因为有些东西告诉我它需要修改。