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

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

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

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

Python

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

Q&A

解決済

2回答

2098閲覧

openpyxlで内容を上書きしてから取り込みたい

tonk

総合スコア22

openpyxl

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

Python

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

0グッド

0クリップ

投稿2020/03/08 09:03

編集2020/03/10 21:28

お世話になります。
よろしくお願いいたします。

openpyxlで取り込んだエクセルのシートを
ブラウザで閲覧できるビューワーをpython3で作ってます。

以下が取り込みの処理になります。

python3

1import openpyxl 2 3wb = openpyxl.load_workbook("sample.xlsx", data_only=True) 4ws = wb["Sheet1"] 5 6 for r in ws.rows: 7 if r[0].row == 1: 8 header_cells = r 9 else: 10 row_dict = {} 11 for k,v in zip(header_cells,r): 12 row_dict[k.value] = v.value

シートのヘッダーと該当セルを辞書化してhtmlに渡してます。
その際他の列の内容によって、内容を上書きして取り込みたいセルがありますが
どのように書けばよいのか、悩んでいます。

excel

1  A B 21 山 0 32 海 0 43 山 0 54 海 1 #B列に1が入ってる場合、A列の"海"を"川"として取り込みたい

if B == 1:
A = "川"
みたいな単純な書き方ではダメで、しばらく考えあぐねています。
ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。

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

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

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

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

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

meg_

2020/03/08 12:14

実証可能なコードを提示いただくと回答がつきやすくなるかと思います。
tonk

2020/03/10 21:28

追記いたしました。よろしくお願いいたします。
meg_

2020/03/11 11:56

追記されたコードはforのところで「unexpcted indent」のエラーが出ますよ。
guest

回答2

0

ベストアンサー

pandasを使ってDataFrameで変換してしまった方が楽ではないでしょうか。
イメージ説明

python

1import openpyxl 2import pandas as pd 3 4wb = openpyxl.load_workbook("data\sample.xlsx") 5ws = wb.active 6 7df = pd.DataFrame(ws.values, columns=["col1" ,"col2"]) 8 9#col2列が1のcol1列を'川'に書き換える 10df.loc[df.col2 == 1, "col1"] = '川' 11 12print(df[['col1']])

追記
pandasの方がSQLっぽく操作できて便利なので書いてみましたが、
それを使わずVBA的に書くならこうなりますかね。
辞書形式にしたいように見えたので、Excelの行数をキーにしてあります。

python

1import openpyxl 2 3wb = openpyxl.load_workbook("data\sample.xlsx") 4ws = wb.active 5 6row_dict = {} 7for r in ws.rows: 8 if r[1].value == 1: 9 r[0].value = '川' 10 row_dict[r[0].row] = r[0].value 11 12print(row_dict)

投稿2020/03/08 12:57

編集2020/03/10 22:37
yureighost

総合スコア2183

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

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

tonk

2020/03/10 21:17

とてもシンプルに書けるんですね。 ご提案ありがとうございます。検討してみたいと思います。 やはりopenpyxlで標記のことを実現するのは困難なのでしょうかね。
tonk

2020/03/11 21:49

改めてのご回答ありがとうございました。 実現したいことをネットで都度調べながら書いてるので リストで取り出せることも分かってませんでした。 ありがとうございました。
guest

0

簡単な例です。

Python

1for i in range(1, 10): 2 if ws.cell(row=i, column=2).value == 1: 3 if ws.cell(row=i, column=1).value == '海': 4 print('川') #ここに実際の処理を書く

投稿2020/03/11 12:08

meg_

総合スコア10577

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

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

tonk

2020/03/11 21:50

ご回答ありがとうございました。 様々な実現の仕方を知ることができて大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問