私のこの投稿で最初に説明された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 ファイルを調べました (標準については、この Web サイトを参照してください)。openpyxl
何らかの理由で、 を使用して書式設定を変更するときにセル スタイルの参照を選択したままにすると、セル スタイルの参照が変更されることに気付きました。たとえば、セルB1
(letter 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
これを担当する可能性が最も高いですか? 何かが修正が必要だと言っているからです。