LoginSignup
0
0

openpyxlの使用

Last updated at Posted at 2024-05-25

概要

今回はopenpyxlの使用についてまとめたいと思います。
なお、メモ書き程度に記載していますので、ご了承ください。随時、情報を追加していきます。

openpyxlはpythonのライブラリであり、
Excelファイル(.xlsx)を読み書き(入出力)できます。
今回は、以下を試しました。

1)カラムをエクセルに表示する
2)特定のカラムにおいて重複した値は削除する
3)セル全体から特定のキーワードの位置情報を取得する

実行環境

・windows:Windows11Pro 23H2
・Python 3.12.3
・pandas 2.2.2
・openpyxl 3.1.2

参考サイト

結果

image.png

ソースコード◇1と2

import csv
import openpyxl
import pandas as pd



################# 新規作成#############################
######################################################
wb = openpyxl.Workbook()
ws = wb["Sheet"]

###################### データ#########################
######################################################
## カラム= class,numの設定
## classはA,B,Cのいずれか
## numは1-12のいずれか
df = pd.DataFrame([
        ['A',5], 
        ['B',9], 
        ['C',3], 
        ['C',5], 
        ['C',2], 
        ['C',10], 
        ['B',12],
        ['A',6],
        ['B',7],
        ['C',1], 
        ],columns=['class','num'])

## カラム名とカラム数の取得
temp_column_name = []
for column_name in df:
        temp_column_name.append(column_name)
LENGTH = len(df[temp_column_name[0]])

## 特定のカラム名(class)の値の取得(重複なし)
column_kind = []
for i in range(LENGTH):
        column_kind.append(df[temp_column_name[0]][i])
column_kind = list(dict.fromkeys(column_kind))
LENGTH_COLUMN_KIND = len(column_kind)

##################### 番号(1-12)の表示####################
#########################################################
START_COLUMU = 2
for alphabet,num in zip (range(66,91),range(1,13)):
    ws[f"{chr(alphabet)}{START_COLUMU}"].value = num


################ カラム>>>classの表示#####################
#########################################################
for i in range(LENGTH_COLUMN_KIND):
    ws[f"A{3 + i}"].value = column_kind[i]


################ カラム>>>numの表示#####################
#########################################################
## 該当のnumがある場合1を出力
for i in range(LENGTH_COLUMN_KIND):
    for class_,num in zip(df[temp_column_name[0]],df[temp_column_name[1]]):
        if class_ == column_kind[i]:
            ws[f"{chr(65 + num)}{3 + i}"].value = 1


wb.save('auto.xlsx')
wb.close()

エクセルファイル

image.png

ソースコード 3

location.py
import openpyxl
import pandas as pd

# カラムが存在するか否かを調べる
# カラムが存在した場合、データのスタートと終わりのセルの位置情報を格納する
def get_col_start(ws, dic_data):
    row_count = ws.max_row
    for col in ws.columns:
        count = 0
        for cell in col:
            count += 1
            # セルのデータを文字列に変換
            try:
                value = str(cell.value)
            except:
                continue
            # キーワードに一致するセルの位置情報を取得
            for key in dic_data:
                if value == key:
                    # キーワードの位置情報のアルファベット
                    dic_data[key][start] = openpyxl.utils.get_column_letter(cell.column) + str(cell.row + 1)
            if cell.value is None:
                for key in dic_data:
                    if openpyxl.utils.get_column_letter(cell.column) in dic_data[key][start]:
                        dic_data[key][end] = openpyxl.utils.get_column_letter(cell.column) + str(count - 1)
                break
            if row_count == count:
                for key in dic_data:
                    if openpyxl.utils.get_column_letter(cell.column) in dic_data[key][start]:
                        dic_data[key][end] = openpyxl.utils.get_column_letter(cell.column) + str(count)
                break

    # 列名の取得を取得できたか否かの確認
    for key,values in dic_data.items():
        if dic_data[key][start] == INITDATA:
            print(f"<<{key}>>の列を取得できませんでした")
            return False
        else:
            print(f"<<{key}>>の列を取得できた")
    print(dic_data)
    return dic_data

if __name__ == '__main__':
    filename = 'test.xlsx'
    wb = openpyxl.load_workbook(filename)
    ws = wb['Sheet1']
    key1 = "やること"
    key2 = "時間帯"
    INITDATA = '-1'
    start = "start_row"
    end = "end_row"
    dic = {
    key1 : {start : INITDATA,
            end : INITDATA},
    key2 : {start : INITDATA,
            end : INITDATA},
    }

    # 関数の実行:シート全体を検索
    result = get_col_start(ws, dic)
'''
以下が出力結果
<<やること>>の列を取得できた
<<時間帯>>の列を取得できた
{'やること': {'start_row': 'B2', 'end_row': 'B4'}, '時間帯': {'start_row': 'C2', 'end_row': 'C7'}}
'''
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0