openpyxl在关闭文件时选中其中一个单元格时突出显示多个单元格

时间:2013-08-09 11:06:32

标签: python xml python-2.7 openpyxl

我在编程上突出显示openpyxl中的单元格时遇到了奇怪的行为,最初在我的this post中进行了描述。我花了一些(更多)时间来调查这个并设法跟踪这个错误的来源。我不知道这是否是重现它的唯一方法,也许某些步骤不是必需的,但下面的示例代码最接近我实际做的事情:

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文件,我观察到了这种行为(标准见this website)。我注意到,由于某些原因,当您使用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模块的哪一部分最有可能对此负责?因为有些东西告诉我它需要修改。

1 个答案:

答案 0 :(得分:0)

不是我解决了这个问题(因为这需要修改我没有时间的库)但是我确实找到了解决这个问题的方法:Python中的win32com模块并通过Python脚本驱动Excel COM。像梦一样工作,功能远远超过openpyxl。唯一的缺点是您需要Excel许可证才能使用此解决方案。对于有兴趣做同样事情的人,我建议this page