🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
openpyxl

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

Python

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

Q&A

解決済

1回答

840閲覧

openpyxl既を用いてダウンロードデータを既存のエクセルファイルの最終行にコピペ

pikachu1

総合スコア9

openpyxl

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

Python

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

0グッド

0クリップ

投稿2021/01/15 06:51

前提・実現したいこと

python初心者です。
ウェブサイトよりダウンロードしたエクセルデータをopenpyxlにて
別のエクセルファイルAに張り付けていく作業を試みています。
Aには既に幾つかデータが存在しているため最終行の次の行から
貼り付け作業を行っていきたいと考えております。
どなたか解決策が分かる方いらっしゃらないでしょうか??

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

該当のソースコード

import openpyxl as px inwb = px.load_workbook(r"パス")    #コピー元 inws = inwb["Sheet2"] outwb = px.load_workbook("貼り付け先") #貼り付け先 outws = outwb.active rows = inws.max_row columns = inws.max_column def input_excel(row_num):     ダウンロードデータをlistに代入し、貼り付け in_list=[] start_col = "A" goal_col= "AB" ranges = start_col + str(row_num) + ":" + goal_col+str(row_num) for i in inws[ranges]: for a in i: in_list.append(a.value) outws.append(in_list) outwb.save("パス") for i in range(rows):    #ダウンロードしたをすべて張り付けていく i+=1 print(i) input_excel(i) outwb.save("パス") nwb.close() outwb.close()

試したこと

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

上記のコードでデータを張り付けることはできますが、ペースト先の行がAの最終行から
大幅に離れていたりします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

openpyxlの考えている最終行は何かが入っている行の一番下ですが、pikachu1さんが考えている最終行は値が入っている行の一番下なのでしょう。
例えば行のどれかのセルに右寄せとかフォントが赤とかの書式が入っていて値が空白であれば、openpyxlがあると思い、pikachu1さんがないと思うことがあるという意味です。

読み込んだ出力用のエクセルの列を全部空白かどうかを下から調べていって、空白以外のものが入っている列を最終行だと思うことにすればよいのです。

少し読みにくいかもしれませんが、サンプルのプログラムを載せておきますので参考にしてください。
outws = のあとに、このコードを入れてみてください。

python

1def not_none(lst): 2 s = set(lst) 3 s.add(None) 4 return len(s) == 1 5 6for i in range(outws.max_row-1, -1, -1): 7 if not_none([x.value for x in list(outws.rows)[i]]): 8 break 9 10print("this sheet has", i, "non-nempty rows")

投稿2021/01/15 08:09

編集2021/01/15 09:19
ppaul

総合スコア24670

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

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

pikachu1

2021/01/15 08:55

ご回答ありがとうございます! 上記のコードで試してみて成功した感じだったのですが もう一度試みたところ上記のコードの処理が始まってから 終わらなくなってしまいました。。。 エクセル自体は600kb程度なのでそんなに重くないと思いますが これは単純にパソコンの調子の問題ですかね??
pikachu1

2021/01/15 09:02

もう一度確認してみたら問題なさそうでした!! ありがとうございます!!
ppaul

2021/01/15 09:21

日本語が間違っていたので、修正しておきました。 not_nanを手軽に実装するために集合(set)を使っていますが、もう少しわかりやすい方法もあるかもしれません。 思いついたら、お知らせします。
pikachu1

2021/01/19 08:16

本当に感謝です。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問