環境システム株式会社公式HP

〒660-0083 兵庫県尼崎市道意町7-1-3
尼崎リサーチ・インキュベーションセンター512

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

蛇使いな彼女BLOG

【第98回】Excelファイルからデータを抽出する

2024.02.02

皆様こんにちは。今回からお待ちかね!ハイライターを使ってコード解説をしていきたいと思います👏

1回目は、Excelファイルの読み込みとセル値の抽出です。

 

モトハシあるあるなんですが、貯水池関係のデータの中にはまれに行政に手配して貰わないと手に入らないデータがあります。

例えば流入放流量や水位は国交省のデータベース上に掲載されているものもありますが、ダムによってはデータベースに公開されていないことも・・・!

そんな場合は行政から直接Excel形式のデータを貰うのですが、なぜかいつも手元に届くファイルのバージョンがExcel2003以前の古いものなんです()

そしてPythonではこの古いファイルはどうやっても開くことが出来ません。

 

そこでまず対象ファイルMicrosoft Excel 97-2003 ワークシート (.XLS)をMicrosoft Excel ワークシート (.xlsx)に変換して、Pythonで扱えるようにしてから、特定のセルの値を取得します。

openpyxlとpyexcelは事前にインストールしてください。
モトハシの場合確かpyexcelでファイルを読み込んだ際にエラーが発生しましたが、以下のプラグインをインストールしたら改善されました。

pip install pyexcel-xls
pip install pyexcel-xlsx

変換前のExcelファイルはtestフォルダーにまとめている状態で、ざっと200個を超えています。(一部PDFファイルも含まれていたので、これはExcelに打ち直しました笑)

Excelには、最初のシートのB11B34に水位データが記されています。数式は埋め込まれていません。

import openpyxl
import pyexcel
import os
import pandas as pd
import glob
#プラグインのインストール
#pip install pyexcel-xls
#pip install pyexcel-xlsx

def convert_to_xlsx(xls, save_path):
    pyexcel.save_book_as(file_name=xls,dest_file_name=save_path)


file_path=glob.glob('test/*.xls')

for f in file_path:
    convert_to_xlsx(f,f[:-4]+'.xlsx')


xlsx=glob.glob('test/*.xlsx') 


EL=[]
for x in xlsx:
    wb = openpyxl.load_workbook(x, data_only=True)
    sheet = wb["管理日報"]

    for rows in sheet['B11':'B34']:
        for cell in rows:
            EL.append(cell.value)

res=pd.DataFrame(EL)

簡単なので特に説明が必要な箇所はないのですが、強いて言うなら

wb = openpyxl.load_workbook(x, data_only=True)

data_only=Trueの場合、数式が埋め込まれている場合はその解を取得することができます。数式が無い場合でもセルの値を取得できます。

data_only=Falseの場合、数式そのものを取得します。

    for rows in sheet['B11':'B34']:
        for cell in rows:
            EL.append(cell.value)

指定したシートと範囲の値はスクレイピングと同じく行構造になっているようなので、リストで受けた値をデータフレームで整えたら抽出完了です!

今日はここまで(^_^)/

pagetop