我在编程上突出显示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
模块的哪一部分最有可能对此负责?因为有些东西告诉我它需要修改。
答案 0 :(得分:0)
不是我解决了这个问题(因为这需要修改我没有时间的库)但是我确实找到了解决这个问题的方法:Python中的win32com
模块并通过Python脚本驱动Excel COM
。像梦一样工作,功能远远超过openpyxl
。唯一的缺点是您需要Excel许可证才能使用此解决方案。对于有兴趣做同样事情的人,我建议this page。