Python openpyxl在关闭文件时选择其中一个单元格时高亮显示多个单元格

Python openpyxl在关闭文件时选择其中一个单元格时高亮显示多个单元格,python,xml,python-2.7,openpyxl,Python,Xml,Python 2.7,Openpyxl,我在openpyxl中以编程方式突出显示单元格时遇到了一些奇怪的行为,这一点最初在我的文章中进行了描述。我花了一些(更多)的时间来研究这个问题,并设法追踪这个错误的来源。我不知道这是否是复制它的唯一方法,也许有些步骤是不必要的,但下面的示例代码与我实际所做的最接近: import openpyxl def doStuff(iterations=1, fName='test'): for i in range(iterations): wb = openpyxl.read

我在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>

1.
0
这会导致单元样式发生更改。我非常怀疑我在这里做错了什么,所以:

我的新问题是:
openpyxl
模块的哪个部分最有可能对此负责?因为有些东西告诉我它需要修改。

我并没有解决这个问题(因为这需要修改我没有时间修改的库),但我确实找到了一种解决方法:
win32com
模块在Python中,通过
COM
从Python脚本驱动Excel。工作起来就像一场梦,它的功能远远超过了openpyxl。唯一的缺点是您需要Excel许可证才能使用此解决方案。对于任何有兴趣这样做的人,我推荐。

您不可能很难找到openpyxl的源代码来确定问题:单元格共享样式。当您提交此问题时,此问题已在库中解决。