pythonでエクセルを読み込んでテキスト出力
pythonでエクセルを読み込んでテキスト出力する。
以下ページ用のテキストファイルを作成しているソースコード
windows環境でvscodeでpython,xlrd利用してxlsx読み取り→txt出力。
ループ、if文、ソートあり。
※ループ回数ベタ書き等、汚い箇所あり。
※xlrdのversionは「1.2.0」じゃないとxlsxの読み込みができなかったため、
xlsxの読み込みの場合は普通は別のものを使うのかも。
import os # pip install xlrd==1.2.0 import xlrd import pprint workDir = 'C:/Users/xxx/Documents/xxx/キンヒロ/' wb = xlrd.open_workbook(workDir + 'キンヒロ_ステータス表.xlsx') sheet = wb.sheet_by_name('statusList') heroList = [] for i in range(500): print(sheet.cell(3+i, 2)) if not sheet.cell(3+i, 2).value: break hero = { "startLv" : sheet.cell(3+i, 1).value, "name" : sheet.cell(3+i, 2).value, "attribute":sheet.cell(3+i, 3).value, "profession":sheet.cell(3+i, 4).value, "style":sheet.cell(3+i, 5).value, "hitPoint":str(int(sheet.cell(3+i, 6).value)), "power":str(int(sheet.cell(3+i, 7).value)), "defence":str(int(sheet.cell(3+i, 8).value)), "speed":str(int(sheet.cell(3+i, 9).value)), "leader":sheet.cell(3+i, 10).value, "potential":sheet.cell(3+i, 11).value } heroList.append(hero) def writeData(hero): return "<tr><td>" + hero['startLv'] + "</td><td>" + hero['name'] + "</td><td>" + hero['attribute'] + "</td><td>" + hero['profession'] + "</td><td>" + hero['style'] + "</td><td>" + hero['hitPoint'] + "</td><td>" + hero['power'] + "</td><td>" + hero['defence'] + "</td><td>" + hero['speed'] + "</td><td>" + hero['leader'] + "</td><td>" + hero['potential'] + "</td></tr>" + "\n" def writeTextFile(p_heroList, p_title, p_h3Str): outputFile = workDir + p_title + '.txt' h3Str = "<h3>" + p_h3Str + "</h3>" + "\n" h3Str += "<div>(スキル・潜在能力未考慮)</div>" + "\n\n" otherRankingLinkStr = '<div><br></div><div>その他ランキング(' otherRankingLinkStr += '<a href="https://programming-note.fc2.net/blog-entry-29.html" title="【キンヒロ】HPランキング">HP</a>、' otherRankingLinkStr += '<a href="https://programming-note.fc2.net/blog-entry-28.html" title="【キンヒロ】攻撃力ランキング">攻撃力</a>、' otherRankingLinkStr += '<a href="https://programming-note.fc2.net/blog-entry-31.html" title="【キンヒロ】防御力ランキング">防御力</a>、' otherRankingLinkStr += '<a href="https://programming-note.fc2.net/blog-entry-30.html" title="【キンヒロ】速度ランキング">速度</a>' otherRankingLinkStr += ')</div><div><br></div>' + "\n\n" tableStartStr = '<table border="1">' + "\n" tHeaderStr = "<tr><th>初期</th><th>名前</th><th>属性</th><th>職業</th><th>歩/飛</th><th>HP</th><th>攻撃力</th><th>防御力</th><th>速度</th><th>リーダースキル</th><th>潜在能力</th></tr>"+ "\n" tableEndtStr = "</table>" + "\n" with open(outputFile, mode='w') as f: f.write(h3Str) f.write(otherRankingLinkStr) f.write(tableStartStr) f.write(tHeaderStr) for hero in p_heroList: f.write(writeData(hero)) f.write(tableEndtStr) f.write(otherRankingLinkStr) #そのまま出力 title = "【キンヒロ】星6進化・覚醒・Max70 時のステータス表(スキル・潜在未考慮)" h3Str = "キングダムオブヒーローズ(キンヒロ)の星6進化・覚醒・Max70 時のステータス表" writeTextFile(heroList, title, h3Str) #HP降順で出力 title = "【キンヒロ】HPランキング(スキル・潜在未考慮)" h3Str = "キングダムオブヒーローズ(キンヒロ)の星6進化・覚醒・Max70 時の「HP」ステータスのランキング" heroList = sorted(heroList, key=lambda x: int(x['hitPoint']), reverse=True) writeTextFile(heroList, title, h3Str) #攻撃力降順で出力 title = "【キンヒロ】攻撃力ランキング(スキル・潜在未考慮)" h3Str = "キングダムオブヒーローズ(キンヒロ)の星6進化・覚醒・Max70 時の「攻撃力」ステータスのランキング" heroList = sorted(heroList, key=lambda x: int(x['power']), reverse=True) writeTextFile(heroList, title, h3Str) #防御力降順で出力 title = "【キンヒロ】防御力ランキング(スキル・潜在未考慮)" h3Str = "キングダムオブヒーローズ(キンヒロ)の星6進化・覚醒・Max70 時の「防御力」ステータスのランキング" heroList = sorted(heroList, key=lambda x: int(x['defence']), reverse=True) writeTextFile(heroList, title, h3Str) #速度降順で出力 title = "【キンヒロ】速度ランキング(スキル・潜在未考慮)" h3Str = "キングダムオブヒーローズ(キンヒロ)の星6進化・覚醒・Max70 時の「速度」ステータスのランキング" heroList = sorted(heroList, key=lambda x: int(x['speed']), reverse=True) writeTextFile(heroList, title, h3Str)
「sheet.cell(3+i, 2).value」の部分は、エクセルの行に対する入力セルの箇所によって取得できる列数が異なるため、空行の場合「IndexError: list index out of range」エラーが発生した。
最低限必要な列が取得できるように、エクセルのM列は固定文字を入れておくことにした。
もっと綺麗なソースにするなら、rowからカラム数をとればよいが、
今回はそこまでやらない。