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

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

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

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

Python

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

Q&A

1回答

334閲覧

Python 今使っているPythonファイルにもう一つの機能を追加したい

achochocho

総合スコア0

openpyxl

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

Python

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

0グッド

0クリップ

投稿2024/03/30 15:39

編集2024/03/30 16:53

実現したいこと

現在使用している指定したファイル内の印刷範囲設定をクリアするツールに、ページフッターの設定をする記述を追加したい。追加したい内容の詳細は以下。
フォルダ内のファイル全てのシートに対してページフッタ(左側のみ)を設定する。設定条件として、ファイル名が「C」から始まるものにはそのファイルの1シート目のAJ2のセルの値をセット、それ以外のファイル名のものにはそのファイルの1シート目のAG2のセルの値をセットする。
例)testフォルダにCopy.xlsxとPaste.xlsxというファイルが存在する場合、Copy.xlsxファイルに対してはCopy.xlsxファイルの1シート目のAJ2のセルの値、Paste.xlsxファイルに対しいてはPast.xlsxファイルの1シート目のAG2のセルの値をセットする。
1つのファイルに対して何枚シートがあろうと全て1シート目の値をセットしたい。

発生している問題・分からないこと

Pythonを普段から使っているわけではなく、今回初めて使い始めたためあまり理解できていない。
実装のイメージがついていない。
下部に張り付けているソースは印刷範囲をクリアするコード。その中に今回の記述を追加したいがどこに追加すべきかも分かっていない。

該当のソースコード

import os import openpyxl # フォルダパスを指定 folder_path = "." # 必要に応じて変更 # フォルダ内の全てのファイルを検索 for root, dirs, files in os.walk(folder_path): for file in files: # 拡張子が.xlsまたは.xlsxの場合 ext = os.path.splitext(file)[1].lower() if ext in [".xls", ".xlsx"]: # ワークブック読み込み wb = openpyxl.load_workbook(os.path.join(root, file)) # ワークブック内の全てのシートの印刷範囲をクリア for sheetname in wb.sheetnames: sheet = wb[sheetname] sheet = print_area = None # 保存 wb.save(os.path.join(root, file)) wb.close()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ChatGPTに書かせてみたりネットで検索をかけ片っ端から確認したが理想の回答が得られなかった。

補足

プログラミングというものに関しては殆ど初心者であるため、伝わりにくい点が多々あるかもしれません。
なるべく早く解決したいため、ヒントより答えを教授していただけると助かります。
言葉遣い等は気になりませんので自由に回答していただければと思います(説教はいりません)。

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

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

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

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

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

ikedas

2024/03/31 00:39

ヒント。 ページフッターの設定をする記述は、openpyxl.load_workbook()とwb.save()の間に書けばいいと思います。 あと、印刷範囲のクリアの処理は、ご提示のコードでちゃんと動くのですか。一度にいろいろなことをやろうとせず、ひとつひとつ動作を確認しながら進めたほうが、結果的に早くできますよ。説教でした。
achochocho

2024/03/31 01:46

見事な逆張り回答ですね。 提示してあるコードですが問題なく動きます。 元々こちらのツールとは別でページフッタのツールを作成しようとしていましたが、知人に既存のツールに追加すればいいじゃんとのアドバイスを受けたためこのような流れになりました。 ひとつひとつ確認しながらというのはごもっともだと思います。自分はそういった地道な作業が得意では無いため端折っていました。 意識を改める必要がありそうですね、説教ありがとうございます。
meg_

2024/03/31 03:03

> 元々こちらのツールとは別でページフッタのツールを作成しようとしていましたが、 それでも良いと思います。Pythonに慣れてきたら関数化するとかしても良いと思います。
achochocho

2024/03/31 05:31

コメントありがとうございます。 確かにそうですね、本来なら慣れてない段階で全てを同時になんて考える必要は無いと思います、おっしゃる通りです。 ですが、今回に限って言うと自分以外の人も使うことになるので一緒にしてしまいたいと考えています。 慣れないことを安易にすべきではないってことを再認識させられました、、
meg_

2024/03/31 08:06

> 知人に既存のツールに追加すればいいじゃんとのアドバイスを受けたためこのような流れになりました。 初心者にQAサイトで教えるのは中々難しいと思うので、その「知人」から直接教えてもらえないんでしょうか? また印刷関係はプリンターとの相性などもあり環境によっては上手く行かないこともありそうです。(これはPythonではなくVBAでの経験談ですが)
achochocho

2024/03/31 09:27

知人は1つにまとめることができることは知っていますが、具体的な実装方法は分からないとの事です。 プリンターとの相性についてですが、今回のケースだと今のところプリンターは関係ないためそこまで配慮はしていません。 フォルダ内のファイルが操作できることだけを目的としています。
ikedas

2024/03/31 11:09

> 提示してあるコードですが問題なく動きます。 そうなんですか? ご提示のコードを実際に実行したとき、すでに実装ずみの「印刷範囲のクリア」が実行されることは確実なのでしょうか。それをはっきり確認した後で、新しい機能の追加を試してみるのがいいと思います。 そうでないと、新しい機能の追加を試してうまく動かなかった場合、その理由が機能を追加したせいなのか元々動かなかったからなのかがわからないと思います。 ですから「一度にいろいろなことをやろうとせず、ひとつひとつ動作を確認しながら進めたほうが、結果的に早くできますよ」と申し上げました。 あと、この問題について相談できる人が身近にいますか。そういう人がいたほうが解決がしやすいと思います。
achochocho

2024/03/31 13:18

理解力が乏しくて申し訳ないのですが、すでに実装ずみの「印刷範囲のクリア」が実行されることは確実なのかという質問は、このツール単体がそもそも正しく動くのか、ということで合っているでしょうか。 自分の解釈から申しますとこのツール自体は問題なく動きます。挙動の確認はできています。 印刷範囲の設定の記述の下にページフッタの設定のコードを追加した場合、印刷範囲の設定はされますが ページフッタの設定はされない、という状況です。 シートが何枚あろうと、フォルダの中にさらにフォルダがあろうとすべて印刷範囲のクリアという面は問題がないことを確認しています。 この問題を相談できる人、解決できる人が周りにいるかという質問については、 こちらの分野に精通した友人知人は恐らく居ません。 居ればそこに頼むのがマストなのは分かっていますが、生憎そのような知人は居ないためこちらのサイトに頼ることにしました。
ikedas

2024/03/31 14:09 編集

> 印刷範囲の設定の記述の下にページフッタの設定のコードを追加した場合、印刷範囲の設定はされますが ページフッタの設定はされない、という状況です。 それが「印刷範囲のクリア」という処理だということですか。「クリア」なのに「設定」がされるというのは意味がわからないです。具体的にどのような処理を行う想定なのでしょうか。 率直に言ってしまうと、「ワークブック内の全てのシートの印刷範囲をクリア」というコメントのあとの3行では、sheetとprint_areaという変数にNoneを代入しているもののそれらの変数は何にも使われていません。ですから印刷関係であろうがなかろうが何らかの処理がされているとは考え難いです。この3行を取り除いてもプログラムは何事もなく終了するはずです。 > こちらの分野に精通した友人知人は恐らく居ません。 もしもお仕事として質問で述べている課題を解決しなければならないのなら、この分野に精通した友人知人を探してきてください。お金を払ってでも。その上でなら当サイトで質問することも有意義だと思います。 当サイトはあくまでもボランティアベースで解決策を提供する場ですから、質問者側にも一定のスキルがないと適切な回答を出せるだけの支援をすることは難しいです。
achochocho

2024/03/31 14:31

そうですね、印刷範囲のクリアを目的としているにもかかわらず自分自身が表現をあやふやにしてしまっているせいで相手に解釈を強要している状態になっていますね、そこは申し訳ありません。 質問で載せているコードはすでに印刷範囲が設定されてしまっているファイルに対して、印刷範囲のクリアを行うものであり、設定を行うものではありません。 自分自身、足りないものが多くあることは理解したうえで質問したつもりです。 ですが、やはりそれ以前にもっとすべきことがあったのではないかと思うのも事実です。 今回自分がこの質問を投げたことを間違いだとは微塵も思っていませんが、かなり受け身になっており 誰か教えてくれというスタンスでした。 質問に答える立場のことを考えこちらも何がしたい、どこで躓いているを明確にできるようにすべきでした。 自分の足りないところが浮き彫りになったので良かったと思います。
ikedas

2024/03/31 14:44 編集

> 質問で載せているコードはすでに印刷範囲が設定されてしまっているファイルに対して、印刷範囲のクリアを行うものであり、設定を行うものではありません。 ああ、 クリアをする「設定」を意図しているということですね。でも先に述べたように何もしてないコードなんで、「クリア」もしてないと思います。 反省はほどほどにしてもらえばいいです。問題を解決したければ、回答する側の人々に伝わる説明をできるだけの技術的スキルのある人を探してきてください。おそらくお仕事でやっている課題だと思うのですが、そうであれば今後もそういう方に手伝っていただく必要があると思います。
meg_

2024/03/31 15:54

該当のソースコードは「現在使用している指定したファイル内の印刷範囲設定をクリアするツール」とは別物ですか?「sheet = print_area = None」の部分で「印刷範囲設定をクリア」はできませんがそこは認識合っていますでしょうか?本質問の主旨(もう一つの機能を追加したい)には無関係かもしれませんが一応確認です。
ikedas

2024/03/31 23:56

ここの説明は読みましたか。 https://teratail.com/help/avoid-asking 今あるコードの内容をまったく理解しておらず、「ヒントはいらないから答えをくれ」と言ってくるというのは「コードをください」という「丸投げ質問」であり、この場所では推奨されません。 そのようなことをしてほしいのなら、一番確実で早い方法はお金を払って人を雇うことではないでしょうか。
guest

回答1

0

openpyxl でセルの値を取得する方法
https://coding-with-me.com/python-openpyxl/

openpyxl で番号でシートを取得する方法
https://it-engineer-info.com/language/python/openpyxl-sheets#

シートのフッタを設定する方法
https://kuninet.org/2017/10/12/pythonopenpyxl%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7excel%E3%81%AE%E3%82%B7%E3%83%BC%E3%83%88%E3%81%B8%E8%A8%AD%E5%AE%9A/

詳細は以下のページ
https://cercopes-z.com/Python/openpyxl/module-worksheet-header_footer-opxl.html
フッタ左であれば、 ws.oddFooter.left.text で設定すればよさそうですね。

投稿2024/03/30 16:17

編集2024/03/30 16:20
TakaiY

総合スコア13147

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

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

achochocho

2024/03/30 16:34

なんと!教えていただいたページ初めて見たやつばかりです!わざわざありがとうございます。 確認してまいります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問