web-dev-qa-db-ja.com

openpyxlを使用してExcelで「yyyy-mm-ddhh:mm:ss」の形式の日時オブジェクトでセルをフォーマットする方法

だから、与えられた:

dttm = datetime.datetime.strptime("2014-06-23 13:56:30", "%Y-%m-%d %H:%M:%S")
ws['A1'] = dttm

Excelでの結果は、正しい日時がセルに書き込まれることです(数式を入力した場所で確認できます)。ただし、セルの表示形式はMM/DD/YYYYのみです。

セルを「2014年6月23日」ではなく「2014年6月23日13時56分」のように表示する必要があります。

これを実現するためにセルを明示的にフォーマットするにはどうすればよいですか?

ありがとう!

編集

@alecxeこのソリューションは機能し、まさに私が求めていたものです。 @Woodhamによるソリューションのようなスタイルを保存できるようにしたいと思います。残念ながら、typeErrorが発生します(コメントを参照)。助言がありますか?

7
MothraDactyl

上記にコメントを追加するのに十分な評判がないので、これを新しい回答として追加します。セルをフォーマットする最も簡単な方法は、次のように.number_format = "format"を使用することです。

value = datetime.datetime.strptime("2014-06-23 13:56:30", "%Y-%m-%d %H:%M:%S")
cell = ws['A1']
cell.value = value
cell.number_format = 'YYYY MMM DD'

これはopenpyxl(2.2.2)でテストされています

15
Scott Roberts

Openpyxl 2.4.5の場合、NumberFormatStyleにアクセスできなくなり、NamedStyleを使用する必要があります。使用例を次に示します。

from openpyxl.styles import NamedStyle

date_style = NamedStyle(name='datetime', number_format='DD/MM/YYYY HH:MM:MM')
ws['A1'].style = date_style

または、新しいNamedStyleクラスを使用すると、NamedStyleがインスタンス化されたら、文字列名でスタイルを設定できます。

from openpyxl.styles import NamedStyle

NamedStyle(name='custom_datetime', number_format='DD/MM/YYYY HH:MM:MM')
ws['A1'].style = 'custom_datetime'

ここのドキュメント: https://openpyxl.readthedocs.io/en/stable/styles.html

10
quetzaluz

_format_code_を手動で設定できます。

_value = datetime.datetime.strptime("2014-06-23 13:56:30", "%Y-%m-%d %H:%M:%S")
cell = ws['A1']
cell.value = value
cell.style.number_format.format_code = 'MM/DD/YY HH:MM'
_

または、セルで_set_number_format()メソッドを呼び出すこともできます。

_cell._set_number_format('MM/DD/YY HH:MM')
_

セルに_ws._styles_を設定することにより、スタイルを定義して再利用することもできます。

_from openpyxl.styles import NumberFormat, Style

...

style = Style()
style.number_format = NumberFormat()
style.number_format.format_code = 'MM/DD/YY HH:MM'

ws['A1'] = value
ws._styles['A1'] = style
_

テスト済み-私のために働いた。

1
alecxe

フォーマットするセルにopenpyxl.styles.Styleを設定する必要があると思います。

ここのドキュメント を見ると、次のようなものが機能するはずです:

dttm = datetime.datetime.strptime("2014-06-23 13:56:30", "%Y-%m-%d %H:%M:%S")
s = Style(number_format=NumberFormat('dd-mm-yyyy h:mm:ss'))

ws['A1'] = dttm
ws['A1'].styles = s

更新:スタイルクラスは使用されなくなりました。解決策については、これを参照してください answer

1
Woodham

Openpyxl 2.3.4の場合、NumberFormatはインポートできませんが、次のコードはスタイルを設定するために機能します。

from openpyxl.styles import Style

…
date_style = Style(number_format="DD/MM/YYYY HH:MM:MM")
ws['A1'].style = date_style
1
Peconia

私はこれがうまくいったことを発見しました。 number_formatが使用されていますが、Excelwbに入力されたときに指定された日付形式を認識しているようです。

import datetime
date = datetime.date(2020, 2, 24) # python datetime format is yyyy mm dd
ws.cell(row=[row_ref], column=[col_ref], value=date)
ws.cell(row=[row_ref], column=[col_ref]).number_format = 'dd/mm/yy'
0
Will Grant