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

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

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

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

openpyxl

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

Python

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

Q&A

解決済

1回答

2374閲覧

Python openpyxl 残業時間 0:00:00の取込/書き込み

shirokuma3109

総合スコア6

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

openpyxl

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

Python

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

0グッド

0クリップ

投稿2020/02/18 14:38

編集2020/02/19 15:12

環境です
Python3.8
windows10
openpyxl
EXCEL2013

EXCELの給与一覧データから別のEXCELファイルに書き込む際、普通残業時間や休日時間外時間を明細表EXCELに作成しています。
一覧表上の深夜時間外「0:00:00」ゼロ時間というがデータに存在します。
セルのプロパティはユーザー定義「[h]:mm 」になっています。

はじめは24時間以上の時もダメでしたが、number_format='[h]:mm:ss'
を見つけて「0:00:00」以外の場合は、うまくいくようになりました。

問題は、一覧表の残業時間が「0:00:00」ゼロ時間場合だとうまくいかず、
変な年月日が値に入り(同じ年月日ではありません)、給与明細のEXCELを開いたときに該当のCELLに「###############」として(値は-1)でデータが作成されます。
回避方法を教えてください。

import openpyxl, pprint
import os
import pathlib
from openpyxl.styles import numbers
from datetime import datetime

省略
#一覧EXCELのマックス行まで回す
while i <= maxrow:
省略
#一覧ファイル側
省略
futuzangyojk=ws.cell(row=i,column = 8).value #普通残業時間
print(’futuzangyojk')
省略)
#明細ファイル
ws_iv["D11"].number_format='[h]:mm:ss'
ws_iv["D11"].value = futuzangyojk
print(’futuzangyojk')
(省略)

結果
上が読み込み
下が書込み時

残業「0:00:00」のケース
1899-12-30 00:00:00
1899-12-30 00:00:00

残業1時間のケース
01:00:00
01:00:00
(これはこれでOK)

残業「0:00:00」時間のケース
1900-01-01 12:00:00
1900-01-01 12:00:00

1899-12-30 00:00:00


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

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

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

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

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

guest

回答1

0

自己解決

残業時間が0時間の時、datetimeが 必ず'1899/12/30 00:00:00'を返していることから

zerojk=datetime.strptime('1899/12/30 00:00:00',"%Y/%m/%d %H:%M:%S")

としてstrptimeで「文字列」を「日付」に変換します。

openpyxlのところは省略しますね

次に、データの入っているEXCELの最大行(maxrow)を取得して
最大行までwhileでカウントiをmaxrowまでクルクル回します。

で普通残業の時間を取得するところで
futuzangyojk=ws.cell(row=i,column = 8).value #普通残業時間

if futuzangyojk == zerojk: #普通残業の値がzerojkつまり(日付型の'1899/12/30 00:00:00'とイコールの時
futuzangyojk=0
0を普通残業にぶっこみます。
これでうまくいきました。

試行錯誤の途中、isinstance()関数で datetime型なら0というのを思いつきましたが、残業時間が24時間を超えるとおかしなことになることが判明で上記の方法にたどり着きました。

投稿2020/02/19 15:27

shirokuma3109

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問