1

在我的这篇文章中最初描述的以编程方式突出显示 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最有可能对此负责?因为有些东西告诉我它需要修改。

4

1 回答 1

0

不是我解决了这个问题(因为这需要修改我没有时间的库),但我确实找到了解决这个问题的方法:win32comPython 中的模块并通过COM. 像梦一样工作,并且比openpyxl. 唯一的缺点是您需要 Excel 许可证才能使用此解决方案。对于任何有兴趣做同样事情的人,我推荐这个页面

于 2013-08-24T19:00:41.997 回答