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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

for

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

Python

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

Q&A

解決済

2回答

657閲覧

帳票(エクセルファイル)をシステム取り込み可能な形式に自動変換したい

F91_

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

for

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

Python

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

0グッド

0クリップ

投稿2023/02/16 14:17

編集2023/02/16 14:41

実現したいこと

帳票ファイルの赤枠の部分(P1)を
イメージ説明
取込ファイルのA2列~下へ同じものをコピーしたい
※添付画像が取り込み可能な形式です
イメージ説明

前提

pythonにて会社の帳票エクセルファイルを読み込み、その中の一部をコピーし、
システムに取り込み可能な形式に自動編集させたいです。
読み込むエクセルファイルは会社の帳票に工程などを入力したものです。
現状、そのままの形式ではシステムに工程を取り込みが出来ないので、
一定の条件を満たされた形式に手作業にてコピー&ペーストにて書き換えています。
コピー&ペースト作業を自動化したいので、
プログラム完成後は誰でも操作可能なexeファイルを作成します。

発生している問題・エラーメッセージ

帳票ファイルの赤枠の部分(P1)を取り込みファイルのA2列~下へ同じものをコピーしたい為、
リストにP1を格納し、for文にて繰り返し書き込みを考えました。
しかし、以下のエラーメッセージが発生しています。

['工程パターンコード', '行№', '工程№', '工程外径', '備考'] --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-10-a95a3e2b5b99> in <module> 12 wrtr.writerow(header) # ヘッダーを書き込む 13 ---> 14 for row in ws["P1"]: 15 a=[] 16 for col in row: TypeError: 'Cell' object is not iterable

該当のソースコード

python

1import openpyxl 2import csv 3 4header = ['工程パターンコード', '行№','工程№', '工程外径','備考'] 5 6wb = openpyxl.load_workbook("1.xlsx") 7ws = wb.worksheets[0] 8f=open('取込'+'.csv','a',newline='') 9print(header) 10 11wrtr=csv.writer(f,delimiter=',') 12wrtr.writerow(header) # ヘッダーを書き込む 13 14for row in ws["P1"]: 15 a=[] 16 for col in row: 17 a.append(col.value) 18 19 20for row in ws["C29:O48"]: 21 values = [] 22 23 for col in row: 24 values.append(col.value) 25 del values[4:9] 26 del values[3:7] 27 28 29 if values[2] is None: 30 print(values) 31 32 else: 33 values[1]=values[0] 34 35 36 wrtr.writerow(values) 37f.close()

試したこと

以下のコードにて帳票P1の内容を繰り返し処理にて取り込みファイルA行にコピーさせようとしました。

for row in ws["P1"]: a=[] for col in row: a.append(col.value)

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1for row in ws["P1"]: 2 a=[] 3 for col in row: 4 a.append(col.value)

ws["P1"]はセル1つ分の情報なので、「'Cell' object is not iterable」順に取り出すことはできないと言われています。
なので、

python

1a.append(ws["P1"].value)

とすればいいと思います。

ちなみに、この ws["P1"]をループで回すことで、どのような値が取得できる想定でしたか。

投稿2023/02/17 10:02

TakaiY

総合スコア12765

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

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

F91_

2023/02/18 15:07 編集

ws["P1"]をループで回すことで、取り込みファイルのP1の値が 出力先ファイルの工程パターンコードの行(取り込み可能形式のA行)にP1の値が連続して値が入るという想定でした。 申し訳ございません。 正直、a.append(ws["P1"].value)をどこでループさせれば良いか解決出来ていません・・・
TakaiY

2023/02/19 02:31 編集

質問/コードの中に大事なところが抜けているのでしょう。 まず、話題になっているws["P1"] というのは、とあるブックのあるシートの P!セルを表わしているので、値は1つしかありません。コードで言うと、そのエクセルファイルは 1.xlsx で、 1番目のシート(Sheet1)の P1 です。 「連続で入れたい」とうことは、その P1 がどこか他の場所にもあるのですよね? それは 複数のファイルですか? 複数のシートですか? もしかして、 P20 とか P30 とかですか? もしくは、手動でやるときは、その連続して入れる値というのはどこからコピーしてくるのですか?
F91_

2023/02/21 13:46

連続で入れたいとは=取込ファイルのA2列~下へ同じものをコピーしたいの意味でした。 スタート時点の私の投稿が不明確であり、混乱を招いてしまいました。 以後、このようなことがないよう投稿時は読み手の方々がわかるように致します。 申し訳ございません。 今回は自己解決出来ました。
guest

0

python

1import openpyxl 2import csv 3 4header = ['工程パターンコード', '行№','工程№','工程コード', '工程外径','備考'] 5 6wb = openpyxl.load_workbook("1.xlsx") 7ws = wb.worksheets[0] 8f=open('取込'+'.csv','a',newline='') 9print(header) 10 11wrtr=csv.writer(f,delimiter=',') 12wrtr.writerow(header) # ヘッダーを書き込む 13 14 15 16 17 18for row in ws["C29:O48"]: 19 values = [] 20 a=[] 21 a.append(ws["P1"].value) 22 23 for col in row: 24 values.append(col.value) 25 26 del values[3:7] 27 del values[3] 28 del values[4:6] 29 del values[4] 30 31 32 33 34 35 if values[2] is None: 36 pass 37 38 else: 39 values[1]=values[0] 40 41 42 a.extend(values) 43 print(a) 44 wrtr.writerow(a) 45 46f.close()

投稿2023/02/21 13:50

F91_

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問