PythonでExcel操作:日付を含むデータの処理

全体まとめページは↓より。

やりたいこと

・以下のような読み込みファイルの日付項目が、出力ファイルにシリアル値として書き出されてしまうのを日付型で出るようにする

↑これが

↑出力ファイルに転記するとこうなってしまう

フォルダ構成

VSCodeで実行するときはprg配下を開いてpyファイルを作り実行する。

実装

import os
import openpyxl
from openpyxl import utils
from datetime import datetime, date

#辞書リストの作成関数
def make_shipment(sh):
    shipment_list = []
    for row in sh.iter_rows():
        if row[0].row == 1:
            header_cells = row
        else:
            row_dic = {}
            for v, k in zip(header_cells, row):
                row_dic[v.value] = k.value
            shipment_list.append(row_dic)
    return shipment_list

#ファイル名を入力させる
print("ファイル名を入力:")
filename = input()

#読み込みファイルパスを作成
infile_path = os.path.join("..\indata" , filename)

#出力ファイルパスを作成
outfile_path = os.path.join("..\outdata" , filename)

#読み込みファイルからオブジェクトを生成
iwb = openpyxl.load_workbook(infile_path)
ish = iwb.active

#出力ファイルのオブジェクトを生成
owb = openpyxl.Workbook()
osh = owb.active

#辞書リストを作成
shipment_list = make_shipment(ish)

#日付データをシリアル値から日付型に再変換
list_row = 1
for dic in shipment_list:
    list_row += 1
    dic["日付"] = utils.datetime.from_excel(dic["日付"])
    dic["日付"] = date(dic["日付"].year, dic["日付"].month, dic["日付"].day)


#転記先ヘッダ処理
list_row = 1
osh.cell(list_row,1).value = "No."
osh.cell(list_row,2).value = "日付"
osh.cell(list_row,3).value = "挨拶"
osh.cell(list_row,4).value = "使用回数"


#転記処理
for dic in shipment_list:
    list_row += 1
    osh.cell(list_row,1).value = dic["No."]
    osh.cell(list_row,2).value = dic["日付"]
    osh.cell(list_row,3).value = dic["挨拶"]
    osh.cell(list_row,4).value = dic["使用回数"]

#出力ファイルを保存
owb.save(outfile_path)

出力結果

日付項目がyyyy-mm-ddで出力されている。

ちなみに

date変換を省くと、hhmmssの時刻まで表示される。
冗長な情報になるが、運用上こちらも必要であればあえてdate変換を挟まないようにしよう。

以上

タイトルとURLをコピーしました