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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3187閲覧

for文を用いたエクセルへ値の出力、セルの指定方法

usuke

総合スコア23

openpyxl

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/01/04 16:55

for文を用いたエクセルへ値の出力、セルの指定(python, openpyxl)

ディレクトリにテキストが複数存在していて、それらのテキストには
test=100
など数値が1つ含まれています。
これらの値を全て読み込みエクセルのB列に順番に(B1, B2, B3...)出力したいのですが、セルの指定が上手くいきません。どなたかご教授いただけたら幸いです。

python

1import glob 2import openpyxl as px 3 4a = glob.glob("C:.../*.txt") 5print (a) 6 7for i in a: 8 path = i 9 with open(path) as f: 10 lines = f.readlines() 11 lines_strip = [line.strip() for line in lines] 12 m = [line for line in lines_strip if 'test=' in line] 13 s = ''.join(m) 14 l = s.lstrip('test=') 15 print(l) 16 17 ###ここからエラー 18     ###セルのB列に出力(B1,B2,B3...) 19 for j in range(5): 20 wb = px.Workbook() 21 ws = wb.active 22 ws[1, ('j')] = l 23 wb.save('C:...\samp.xlsx')

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の通りにしてみました。

Python

1import glob 2import openpyxl as px 3 4a = glob.glob("C:.../*.txt") 5print (a) 6 7wb = px.Workbook() 8ws = wb.active 9 10j = 1 11for i in a: 12 path = i 13 with open(path) as f: 14 lines = f.readlines() 15 lines_strip = [line.strip() for line in lines] 16 m = [line for line in lines_strip if 'test=' in line] 17 s = ''.join(m) 18 l = int(s.lstrip('test=')) 19 print(l) 20 21 ws.cell(row=j,column=2).value = l 22 j += 1 23 24wb.save('C:...\samp.xlsx')

一つのテキストファイルに一つの数値で、Excelのセルに保存していくということなので、ループを一つにしました。

ワークブックとシートの指定をループの外に置き、ファイルのリストaiでループさせます。同時にExcelの行数に利用するためのjもカウンタ変数として使用します。
本当は、リストとカウンタ変数を同時に使う方法もありますが、変化が多くなりそうなので使用していません。forenumerateで検索してみてください。

s.lstrip('test=')の部分は切り出した数字が文字列になっていますので、intで整数化しています。

セルの指定はws.cell(row=j,column=2).value = lです。
セルの指定について、rowが行番号になり1,2,3…は1行目,2行目3行目…に相当し、columnが列番号になり1,2,3…はA列,B列,C列…に相当します。そのため、カウンタ変数jをループさせることで、B1,B2,B3を指定していくことになります。

ループを抜けたところでエクセルファイルを保存して終了となります。

投稿2020/01/04 17:06

編集2020/01/04 18:59
frederick_1974

総合スコア303

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

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

usuke

2020/01/04 18:20

ご回答ありがとうございました、おかげでセルの指定が出来ました。 ただ別の問題が生じてしまいまして、for j in range(1,6):で指定したところ、B5にのみ値が出力されてB1からB4までは空欄になってしまいました。for文の位置がおかしいのでしょうか...。 import glob import openpyxl as px a = glob.glob("C:.../*.txt") print (a) for i in a: path = i with open(path) as f: lines = f.readlines() lines_strip = [line.strip() for line in lines] m = [line for line in lines_strip if 'test=' in line] s = ''.join(m) l = s.lstrip('test=') print(l) for j in range(1,6): wb = px.Workbook() ws = wb.active ws.cell(row=i,column=2).value = l wb.save('C:...\samp.xlsx')
frederick_1974

2020/01/04 18:28 編集

失礼しました。 ループさせるのは、セルへの入力部分だけでいいのに、ブックやシートの指定、ブックの保存までループの中に残してしまいました。上記に記載のコードを修正いたしました。 先ほどのままだと、ループの最後で保存するけれど、また新たにブックとシートを指定し、同名保存を繰り返すことになり、最後のループ(B5セル)のブックだけ保存されることになりました。
frederick_1974

2020/01/04 18:34 編集

すみません、多分間違っていますね。ちょっと書き直します。一つのファイルに数字が一つですよね。
usuke

2020/01/04 18:48

あー、なるほど!確かに保存までループの中に入れたらそうなりますよね...。 そうです、1つのファイルに数字が1つ入っています。
frederick_1974

2020/01/04 18:59

一つのファイルに一つの数字で、それがExcelに記入されていくということなので、ループは一つとしました。何度も修正してしまい、申し訳ありません。
usuke

2020/01/04 19:20

出来ました、ありがとうございました!ご丁寧なご説明のおかげで理解が進みました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問