web-dev-qa-db-ja.com

Python:openpyxlセルのフォントの色の読み方

some_cell.font.color.rgbを印刷しようとしましたが、さまざまな結果が得られました。

欲しいもの( "FF000000"など)を入手した人もいれば、Value must be type 'basetring'を取得した人もいます。後者は、これらのセルのフォントの色を実際に定義していないためだと思います。

Openpyxl2.2.2を使用しています

18
Norfeldt

これはopenpyxlのバグだと思うので、報告する必要があると思います ここ

次のコードのデバッグ(もちろん trepan3k を使用):

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
c = ws['A4']  # cell gets created here
print(ws['A4'].font.color)

私は得る:

Color(rgb=Value must be type 'str', indexed=Value must be type 'int', auto=Value must be type 'bool', theme=1, tint=0.0, type='theme')

これは、ファイルopenpyxl/descriptors/base.pyのクラスTyped()_ repr _()から取得されます。このメッセージは、値が初期化されていない場合に表示されます。 「indexed」と「auto」も設定されていないことに注意してください。

しかし、これらはおそらくws['a4']のアクセス用のコードが実行されたときに設定されているはずです。

注:メッセージのわずかな違い:「basestring」の代わりに「str」は、おそらく私がPython 3以下のopenpyxl2.2を使用していたという事実に起因します。 3

そして、私の例で追加すべき他のコードがある場合は、少なくとも https://openpyxl.readthedocs.org/en/latest/index.html がそれを示しているはずです。

参照 openpyxlセルスタイルが正しくレポートされない 開発者の1人が非常に多くの言葉で同じことを言っているようです。

編集

他のいくつかの点に注意する必要があるかもしれません。まず、値を設定してから読み取ることができます。たとえば、次のように実行できます。

c.font.color.rgb = "FF000000"

次に、ブール値でc.font.color.rgbをテストすると、値が設定されているように見えます。あれは

if c.font.color: print("yes")

「はい」と出力されます。

11
rocky

しばらく前にopenpyxlソースに飛び込んで、スタイリングの問題を解決しようとしたことを覚えています。既存のExcelファイルを開いている場合、セルにはコンテンツが含まれている場合にのみスタイルが設定されます。たとえば、A:Aが黄色で強調表示されている.xlsxがあり、A1のみにテキストが含まれている場合、openpyxlではA2で使用できる強調表示情報がありません。また、(openpyxlを使用して)A2にデータを記録すると、スタイリングなしでそのセルが開始され、A2を除くすべての場所でA列が黄色になります。

私が遭遇した困難は、セル作成にモンキーパッチを適用して、シートに継承ベースで維持する必要のあるスタイルがあるかどうかを判断することでした。 A:Aのスタイルが太いボーダー、B:Bのスタイルが細いボーダーの場合、どちらから継承しますか?

1
user2426679

考えられる代替ソリューションは、_cell.color_および_cell.color.rgb_のタイプをテストすることです。

次のテストでは、色が設定されたセルが得られるようです。

_if cl.font.color != None and type(cl.font.color.rgb) == str:
   # where cl =  cell of interest
   rbg = cl.font.color.rgb  
_

スタイルを使用する場合は_cell.font.color_はNoneであり、色が設定されていない場合はtype(cell.color.rgb)は_<class 'openpyxl.styles.colors.RGB'>_のようです。

注:このソリューションは十分にテストされておらず、すべての場合に機能するとは限りません。

0
Marked