【旅程表 #02】完全に理解した

※ダニング・クルーガー効果

昨日に引き続き旅程表アプリを作っていきます。今回は大まかな雛形とxlsxファイル操作をします。

CSVファイルの準備

最終的にどんな感じになるかはまだわかりませんがネットの乗り換え案内のコピペで時刻とか自動で入力できたらいいなって思っているので

元データ→pythonCSVファイル→python→xlsxファイル

というような流れでデータを処理していくことにします。

入れたいデータとしては発着する駅と時刻、番線と路線名、列車番号、列車種別(普通/快速/特急〇〇号とか)、行先です。(ホームミスって乗り換え失敗したことが幾度とあるため)あと鉄道だけではなくて船だったり徒歩だったり、あるいは美術館とかも入れたいのでその識別番号とオプション的なものを前後につけて

識別番号, 発駅, 発時刻, 発番線, 着駅, 着時刻, 着番線, 路線, 列車番号, 列車種別, 行先, オプション

としてみます。 準備したものはこちら

0,20220214
1,東京,0700,15,名古屋,0839,16,東海道新幹線,203A,のぞみ203号,新大阪,0
1,名古屋,0845,6,大垣,0918,,東海道本線,,特別快速,大垣,0

特別快速の列車番号を調べるのがめんどくさかったので空欄です(おい)

xlsxファイルの初期設定

余白設定

とりあえず周りを1インチずつ余白をとってヘッダーフッターはとらないようにしてみます。コードは以下の通り。

#margines settings
worksheet = workbook.active
worksheet.page_margins.left = 1
worksheet.page_margins.right = 1
worksheet.page_margins.top = 1
worksheet.page_margins.bottom = 1
worksheet.page_margins.header = 0
worksheet.page_margins.footer = 0

セルの幅の設定

とりあえず適当です。↓みたいな感じに。 f:id:kanade_2001:20220213163924p:plain

worksheet.column_dimensions['A'].width = 5
worksheet.column_dimensions['B'].width = 1
worksheet.column_dimensions['C'].width= 3
worksheet.column_dimensions['D'].width = 7
worksheet.column_dimensions['E'].width = 35
worksheet.column_dimensions['F'].width = 15

ファイル書き込み

CSVファイル

とりあえずさっきつくったCSVファイルを開きます。

with open(csv_filename, encoding='utf8',newline="") as csv_file:
    csvreader = csv.reader(csv_file)
    for row in csvreader:

これでファイルが開けてそれぞれの行ごとに処理していくことができます。

シート作成

それぞれの日に分けてシートに保存したいのでまずはそこから作っていきます。 シート名には日付を設定するとしてほしい日付のシートがあるかを調べればいいので、workbook.sheetnamesでシート名を取得した後if inで条件を満たすものがあるかを調べます。 ここでのrowは日付の含まれている[0,20220214]です

if not row[1] in workbook.sheetnames:
    workbook.copy_worksheet(workbook.worksheets[0])
    workbook.worksheets[-1].title = row[1]
worksheet = workbook[row[1]]

最後にworksheet = workbook[row[1]]として操作するシートを指定しています。 既存の場合だとifの内容が処理されないので操作するシートが指定されるだけです。

データ書き込み

ここまでできたのであとはmax_rowでシートのどこまで記入されているかを確認した上でその次の行からデータを埋めていくだけです。

if row[0] == "1":
    row_write = worksheet.max_row + 1
    worksheet.cell(row=row_write,column=4).value = row[1]
    worksheet.cell(row=row_write,column=1).value = row[2]
    worksheet.cell(row=row_write,column=3).value = row[3]
    worksheet.cell(row=row_write+3,column=4).value = row[4]
    worksheet.cell(row=row_write+3,column=1).value = row[5]
    worksheet.cell(row=row_write+3,column=3).value = row[6]
    worksheet.cell(row=row_write+1,column=5).value = row[7]
    worksheet.cell(row=row_write+1,column=6).value = row[8]
    worksheet.cell(row=row_write+2,column=5).value = row[9]
    worksheet.cell(row=row_write+2,column=6).value = row[10]

まとめ

これまでのコードのまとめです

import openpyxl
import os
import csv

name = "Sample1"

#
xlsx_filename = name + ".xlsx"
#filename = path + filename
#filename = os.path.expanduser(filename)
csv_filename = name + ".csv"


workbook = ""
worksheet = ""



if os.path.exists(xlsx_filename):
    #open file
    print("File exists.")
    workbook = openpyxl.load_workbook(xlsx_filename)
    
else:
    #create new file
    print("File doesn't exist.")
    workbook = openpyxl.Workbook()
    workbook.save(xlsx_filename)
    
    #edit sheet name
    workbook.worksheets[0].title = "TITLE"
    
    #margines settings
    worksheet = workbook.active
    worksheet.page_margins.left = 1
    worksheet.page_margins.right = 1
    worksheet.page_margins.top = 1
    worksheet.page_margins.bottom = 1
    worksheet.page_margins.header = 0
    worksheet.page_margins.footer = 0
    
    #dimensions settings
    worksheet.column_dimensions['A'].width = 5
    worksheet.column_dimensions['B'].width = 1
    worksheet.column_dimensions['C'].width= 3
    worksheet.column_dimensions['D'].width = 7
    worksheet.column_dimensions['E'].width = 35
    worksheet.column_dimensions['F'].width = 15
    

with open(csv_filename, encoding='utf8',newline="") as csv_file:
    csvreader = csv.reader(csv_file)
    for row in csvreader:
        print(row)
        if row[0] == "0":
            print("Check DATE")
            if not row[1] in workbook.sheetnames:
                workbook.copy_worksheet(workbook.worksheets[0])
                workbook.worksheets[-1].title = row[1]
            worksheet = workbook[row[1]]
        
        if row[0] == "1":
            row_write = worksheet.max_row + 1
            worksheet.cell(row=row_write,column=4).value = row[1]
            worksheet.cell(row=row_write,column=1).value = row[2]
            worksheet.cell(row=row_write,column=3).value = row[3]
            worksheet.cell(row=row_write+3,column=4).value = row[4]
            worksheet.cell(row=row_write+3,column=1).value = row[5]
            worksheet.cell(row=row_write+3,column=3).value = row[6]
            worksheet.cell(row=row_write+1,column=5).value = row[7]
            worksheet.cell(row=row_write+1,column=6).value = row[8]
            worksheet.cell(row=row_write+2,column=5).value = row[9]
            worksheet.cell(row=row_write+2,column=6).value = row[10]


workbook.save(xlsx_filename)

これを3回実行した結果がこちら f:id:kanade_2001:20220215003206p:plain 重複処理とかしてないのでこんな感じになっちゃいますね。 あと名古屋が2列連続並んでいるのも気持ち悪いですし、時刻の早い順からデータを入力できればいいですが前後したりした場合に対応できてないので次はそこら辺を実装していきたいと思います。あと、xlsxファイルへの入力は他のところでも使い回すことになりそうなので別ファイルに移したりして見やすくもしたいです。

今日はここまで。それでは〜