質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7406閲覧

OpenPyXLで日付の書式設定をしたセルの数式バーの表示について

nto

総合スコア1438

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/03/04 10:27

編集2020/03/05 05:36

日付の書式設定を与えたセルの数式バーが望んだ表示にならない

Python

1import openpyxl as px 2from openpyxl.styles import numbers 3 4wb = px.load_workbook(file_path) 5ws = wb['Sheet1'] 6mr = ws.max_row 7 8datalst = ['3/4', '4/4', '5/4', '6/4'] 9n = 0 10 11for d in datalst: 12 tmp = ws.cell(row=mr+n, column=1) 13 tmp.value = d 14 tmp.number_format = 'm/d' 15 n += 1 16 17wb.save(file_path)

例として上記の様に、ファイル、シートを指定し
一番最後の入力されている行の次の行に日付を書き込み保存する
というコードとなります。

望んだ形としてはセル表示は「3/4」数式バーの中身は「2020/3/4」
といった形を目指しております。
(後からExcelをソートする際、年単位で区切る事ができる為)

上記ではリスト内のスラッシュ区切りの日付データをセルに書き込
み保存し、保存したファイルを開いて入力したセルの数式バーを確
認すると「3/4」のままとなっています。
一度セルをアクティブにしてあげると「2020/3/4」という表示に
数式バーが切り替わります。

普段手入力をする場合には、予め対象のセルには書式設定をしてあり
手入力で「3/4」とデータを入力すれば自動で「2020/3/4」と数式バー
は置き換わってくれます。

・ 見た目上は月/日
・ 数式バー上では西暦/月/日

以上の形を目指す為の方法がわかる方またはアドバイスを頂けると
幸いです。

試してみた方法

与えるデータを予め2020/3/4としてデータを渡した場合には数式バー
のみならず見た目上まで2020/3/4となってしまいました。

考察

恐らく処理のプロセスとしては
直接入力で対象のセルに値を入力→任意の書式設定へ変更
という事でしょうか?
これを手作業で行った所、質問内容と同じ症状になりました。
一度クリック等し、アクティブにさせ、そのセルの選択を解除する
事で目標としていた状態となります。(手作業の場合は)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Python

1def serial(var): 2 from datetime import datetime 3 box = [int(x) for x in var.split('/')] 4 box.insert(0, datetime.now().year) 5 conv_date = datetime(box[0], box[1], box[2]) -datetime(1899, 12, 30) 6 return conv_date.days 7 8for d in datalst: 9 d = serial(d) 10 tmp = ws.cell(row=mr+n, column=1) 11 tmp.value = d 12 tmp.number_format = 'm/d' 13 n += 1

以上のコードで解決ができました。
考察に記入した通りの動作の様で
一度シリアル化し入力→書式設定で思っていた通りの動作の確認ができました。

なんとなくでしかわかっていなかったシリアル値ですが

エクセルでは日付は 1900 年 1 月 1 日を起点 (1 日目) として、そこから日数を加算した数値で日付データがシリアル値

というものだそうでした。
そこで文字列のデータをint型に成形

希望の値 - 起算日(1899/12/30) = 起算日からの経過日数 ≒ シリアル値

という関数を作り解決に至りました。

投稿2020/03/05 09:29

nto

総合スコア1438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問