質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2549閲覧

Excelの表データを行ごとに辞書として登録したい

SoAmi

総合スコア1

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/04 01:47

編集2020/11/04 03:59

前提・実現したいこと

Excelファイルの内容を他のExcelに転記してデータベースを作りたいです。

読み込みたいExcelは表形式になっており、1、2行目が不規則に結合されたセルとなっております。
1、2行目をヘッダーとし、3行目以降を値として辞書にしたいと思い下記コードを書きましたがprintした際に表示されたものがExcelの内容と異なっておりました。

エラーのメッセージが出たわけではないのでどうすれば良いかわからず困っています。

該当のソースコード

import openpyxl wb = openpyxl.load_workbook('filename.xlsx') ws = wb["データ"] #シート名 header_cells = ws.marged_cells[1:2] parts_list = [] for row in ws.iter_rows(min_row=3): row_dic = {} for k, v in zip(header_cells, row): row_dic[k] = v.value parts_list.append(row_dic) print(parts_list)

元になるExcel画面です。
実際は139列、536行あります。
イメージ説明

実行結果

(<Cell 'データ'.A1>, <Cell 'データ'.B1>, <Cell 'データ'.C1>, <Cell 'データ'.D1>, <MergedCell 'データ'.E1>, <Cell 'データ'.F1>, <MergedCell 'データ'.G1>, <Cell 'データ'.H1>, <MergedCell 'データ'.I1>, <Cell 'データ'.J1>, <MergedCell 'データ'.K1>, <Cell 'データ'.L1>, <MergedCell 'データ'.M1>, <Cell 'データ'.N1>, <MergedCell 'データ'.O1>, <Cell 'データ'.P1>, <MergedCell 'データ'.Q1>, <Cell 'データ'.R1>, <MergedCell 'データ'.S1>, <Cell 'データ'.T1>, ・・・・

補足情報(FW/ツールのバージョンなど)

windows10
python3.8

Excelの内容は品番や品名、産地名等です。

とても初歩的なことなのだと思い申し訳ないです。
どなたかお知恵を貸していただけないでしょうか。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jeanbiego

2020/11/04 02:30

・コードは、<code>ボタンで出てくる"""の間に書いてください。インデントが反映されて読みやすくなります。 ・元のExcelを、セルの値は何でも(ダミーデータでも)良いのでアップロード等してもらわないと再現できません。
meg_

2020/11/04 03:28

・コードが読めません。読めるようにしてください。 ・「実行結果」はリストになっていないようですが、何故でしょうか?
SoAmi

2020/11/04 04:00

大変申し訳ございません。 コードは<code>ボタンから修正しました。 また、元のExcelのダミーを画像で追加しました。
jeanbiego

2020/11/04 04:09

質問欄に記載のコードは実際のコードですか? ws.marged_cells[1:2] こことかエラー出ると思うのですが。
guest

回答1

0

ベストアンサー

pandasで読み込んでto_dictで辞書にしました。
結合セルの扱いは、2行目にカテゴリ名があればそれを、なければ1行目を採用しました。(dct_kがそれ)
辞書にする場合、「機種名」とか同じkey(B, F列)があるとダメですね。

python3

1import pandas as pd 2import numpy as np 3df = pd.read_excel('filename.xlsx') 4dct_k = [] 5for c in df.columns: 6 if df.at[0,c] is np.nan: 7 dct_k.append(c) 8 else: 9 dct_k.append(df.at[0,c]) 10print(dct_k) # -> ['メーカー', '機種名', '生産地および備考', '客先', '社内', 'サブ機種名', '図番'] 11 12df4dict = df[1:] 13df4dict.columns = dct_k 14parts_list = df4dict.to_dict(orient='list') 15print(parts_list) 16# {'メーカー': ['メーカー1', 'メーカー2', 'メーカー3', 'メーカー4', 'メーカー5', 'メーカー6', 'メーカー7', 'メーカー8'], 17# '機種名': ['機種名1', '機種名2', '機種名3', '機種名4', '機種名5', '機種名6', '機種名7', '機種名8'], 18# '生産地および備考': ['生産地および備考1', '生産地および備考2', '生産地および備考3', '生産地および備考4', '生産地および備考5', '生産地および備考6', '生産地および備考7', '生産地および備考8'], 19# '客先': ['客先1', '客先2', '客先3', '客先4', '客先5', '客先6', '客先7', '客先8'], 20# '社内': ['社内1', '社内2', '社内3', '社内4', '社内5', '社内6', '社内7', '社内8'], 21# 'サブ機種名': [nan, nan, nan, '機種名4', '機種名5', '機種名6', '機種名7', nan], 22# '図番': [nan, nan, nan, '図番4', '図番5', '図番6', '図番7', nan]}

投稿2020/11/04 04:34

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SoAmi

2020/11/04 05:18

ありがとうございます。 元のExcelを見直しながら進めていきたいと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問