【发布时间】:2013-08-25 03:00:41
【问题描述】:
在我的this post 中以编程方式突出显示 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 文件,我在其中观察到了这种行为(有关标准,请参阅 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 模块的哪个部分最有可能对此负责?因为有些东西告诉我它需要修改。
【问题讨论】:
-
你不可能通过查看 openpyxl 的来源很难确定问题:单元格共享样式。当您提交此问题时,此问题已在库中得到解决。
标签: python xml python-2.7 openpyxl