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

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

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

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

Q&A

0回答

2075閲覧

pythonでExcelの列幅を自動調整するプログラムを読み解いてみたが、考えが正しいか確認したい。

ot1982

総合スコア6

Python

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

0グッド

0クリップ

投稿2020/10/01 10:09

編集2020/10/01 12:05

pythonでexcelの列幅を自動調整するプログラムを読み解いてみて、1行ずつ何をしているのか
コメントに書き出してみたのですが、その考えが正しいか確認したいです。

まず、下図のようなexcelがあります。

sample.xlsx
イメージ説明

一部文字列が、セルに収まっていないので、列幅を自動調整するためのプログラムを色々調べて
作成し、1行ずつ何をしているのかコメントに書き出してみたのが、下記になります。

import openpyxl as xl #セル幅を自動設定する inputfile = 'sample.xlsx' #sample.xlsxを変数imputfileに代入 wb1 = xl.load_workbook(filename=inputfile) #imputfileを開いて、変数wb1に代入 ws1 = wb1.worksheets[0] #sheet1を取得し、変数wb1に代入 for col in ws1.columns: #sheet1の列のループを行う max_length = 0 #ゼロをmax_lengthに代入 column = col[0].column #どの列のループを行っているかを記憶させる for cell in col: #列に含まれるセルに対してループを行う if len(str(cell.value)) > max_length: #文字列数が変数max_length(ゼロ)より大きかった場合 max_length = len(str(cell.value)) #文字列数に変数max_lengthを代入 adjusted_width = (max_length + 2) * 1.2 #(max_length + 2) * 1.2の列幅を変数adjusted_widthに代入 ws1.column_dimensions[column].width = adjusted_width #adjusted_widthの値をsheet1の列幅の寸法とする。 wb1.save(inputfile) #inputfileを保存

for文のところがあまり自信ないですが、考えが正しいのか確認したいです。
どなたかお分かりになる方、ご教授よろしくお願いいたします。

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

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

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

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

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

kuma_kuma_

2020/10/01 10:23

コメントで気になったのが > if len(str(cell.value)) > max_length: #文字列数が変数max_length(ゼロ)より大きかった場合 > max_length = len(str(cell.value)) #文字列数に変数max_lengthを代入 ではなく > if len(str(”” + cell.value)) > max_length: #文字列数が前回までの最大文字数より大きかった場合 > max_length = len(str(”” + cell.value)) #文字列数を変数max_lengthへ代入 ※ Python の 「str」がnull値に対応しているなら良いがダメな場合エラーになります。 あと > adjusted_width = (max_length + 2) * 1.2 #(max_length + 2) * 1.2の列幅を変数adjusted_widthに代入 > ws1.column_dimensions[column].width = adjusted_width #adjusted_widthの値を現在判断しているsheet1の列幅として設定する。
kuma_kuma_

2020/10/01 10:32

ちなみにwidthの単位はピクセル 文字数 * 1.2でも10文字で12ピクセルで全然足りないですよ 0.75ポイント = 1ピクセルなので 文字が12ポイントで描写されていたら1文字辺り 12ポイント / 0.75ポイント = 16ピクセル 16ピクセル*10文字=160ピクセルになります。
meg_

2020/10/01 10:49

タグに「文字コード」がありますが本質問に関係ありますか?
ot1982

2020/10/01 11:30

すみません、専門用語に疎く、タグに文字コードの意味が分かっていないのですが、どこのことを言っていますか?
kuma_kuma_

2020/10/01 11:48 編集

この質問の一番上が トップ > Pythonに関する質問 My Python My Excel My 文字コード という表示になっているでしょ? これ質問者様が質問の記載の時「文字コード」をタグとして書いたから表示されています。 (タイトルの次の項目) でも「文字コード」今回の質問に関係ないから、質問のタグから削除したほうが良いよというお話。
ot1982

2020/10/01 11:47

kuma_kuma_さん ご教授ありがとうございます。ピクセルのところは、解釈が違うのか、プログラムが間違えているかと言うとどちらになるのでしょうか。またコメント頂いた箇所以外は概ね正しい考えなのでしょうか。
kuma_kuma_

2020/10/01 11:56

> ピクセルのところは、解釈が違うのか、プログラムが間違えているか これは本来質問者様がどんな意図(事)をしたいかで変わってきます。 (前回は指摘する前に閉じられたから答えようがなかった。) 今回コメントを拝見するに辺り「文字数の最大に合わせたかった」という事が判ったので書きこんだわけです。 ますお答えいただいていないのですが結果として、質問者様がしたい事とwidthの指摘事項は合致したのですか? そこが判らないと何とも答えられません。
ot1982

2020/10/01 12:16

タイトルのことですね、文字コードは関係ないので消しました。 それと、ピクセルのところのコードは、各列ごとに最大の文字数を見つけて、その文字数がセルに収まるように列幅を調整するようにしたくて組んでいます。
kuma_kuma_

2020/10/01 12:35

はい > 各列ごとに最大の文字数を見つけて、その文字数がセルに収まるように列幅を調整するようにしたくて組んでいます。 これはコメントで書かれていたので理解できました。 それに対してwidthの値が小さすぎではないですか?単位間違っていませんか?とここで書きました。 結果質問者様はその内容を読んでどうされましたか? ・そうか!と思って直して動かした ・いやそんなことはない!と思って何もしていない。 ・意味不明だから放置している 等どうしたかというお答えがないので答えようがないのです。
Daregada

2020/10/01 13:07 編集

ええと、widthの単位は(Excelのセルの幅と同様に)ピクセルじゃないですよ。 実際にコード動かしてみました?
ot1982

2020/10/01 14:03

実際にプログラム実行すると、セルに収まるように列幅が調整できています。
Daregada

2020/10/01 14:06 編集

ごめんね。あなたにではなく、「widthはピクセル単位」と主張しているkuma_kuma_さん向けの発言です。 こちらの手元でも、実際にプログラムを実行して、(半角文字であれば)セルに収まるように列幅が調整できているのを確認しています。
kuma_kuma_

2020/10/01 14:07

Daregadaさんへ こちらpythonでのExcel操作ができる環境がすぐ構築できないのでVBAで確認しています。 (その為正式回答欄に書いていません) pythonの場合違いましたか?
ot1982

2020/10/01 14:13

プログラムは意図したように動いたので、単位が間違えていませんか?の意味が分からず、何も修正していないです。
kuma_kuma_

2020/10/01 14:16

> 実際にプログラム実行すると、セルに収まるように列幅が調整できています。 それであれば問題ないです。 まずは私の「widthの単位が違うのではないか?」という点に関して取り下げさせてもらいます。 誤解を招き申し訳ございません。 ただそうすると質問者様はなにを目的にこの質問を上げたのですか? 処理は正しく動いている。コメントの指摘はしましたが不備とまでいえないレベル という事は質問者様がはじめ想定した内容を実行確認し再度コメント追加で確認までされている... 考えが正しいことはすでに証明されているのでは?
Daregada

2020/10/01 14:23 編集

どう見ても、Excelの幅の指定と同じ単位(標準のフォントとサイズをベースにした文字単位)ですね。VBAで確認って、それ確認しているとは言えませんよね。少なくとも、openpyxlのAPIドキュメントぐらいは見ないと。 質問者が基にしたコードは、2012年にstack overflowに書かれた質問への返答(2013年)で、openpyxlのバージョンが古いため、現在の3系では動きませんが(質問者の前の質問がそれ)、列幅の設定自体は現在でも通用します。「もっといい幅の調整方法があるぞ」という投稿も含めて以下を参照。 https://stackoverflow.com/questions/13197574/openpyxl-adjust-column-width-size/35790441
kuma_kuma_

2020/10/01 15:31

Daregadanさん、ちょっと失礼すぎますよ。 確かに誤った回答にはなっていますが、少なからず確認はしたが正確な確認ができないからこちらに記載 さらに誤り認めて謝罪までしている人に対して本当に失礼ですね。 >「もっといい幅の調整方法があるぞ」という投稿も含めて以下を参照。 じゃなぜ今ここに書く。前の質問をそこまで把握しているなら前の時点で答えなよ? さらにきちんとした「回答」欄あるだろうそっちに書け! そうしたら回答済みなので余計な心配もしなくてすむわ! こちらは前の質問や結果などは知りません。 ただここで再質問しているから結果がうまくいってないのでは?と思い可能性を書いたまで! 質問者様が困っているのではないか?うまくいかないのであればこういう点はどうですか?と書くのが何が悪い!調子にのるな!
Daregada

2020/10/01 17:46 編集

いや、以下を参照って、2013年からstack overflowで議論されているよ、って話ですが。 前の質問は、そのコードがうまく動かないのはなぜ、という質問で、openpyxlのバージョンアップで仕様が変わったから、と回答して解決済みです。
Daregada

2020/10/01 18:04

この質問は、「意図した通りに動いているが、自分で作ったわけではないので動作を十分に把握していないプログラムの詳細な動きを理解したい」という内容で、エラーメッセージや困っていることが書かれていないことからもそれは明らかですね。
ot1982

2020/10/01 21:28

質問を投稿した理由は、Daregadaさんがおっしゃられた通りです。それが理由で、自分なりに調べて1行ごとに何をやってるかコメントに書き出したので、そのコメントの考えが正しいのか確認したかったのです。これまでの頂いたご意見からすると、一部違うところがあったけど、概ね正しいと認識しました。色々教えていただきありがとうございました。
kuma_kuma_

2020/10/02 00:37

質問者様この質問がその内容なら 「過去に投稿した質問と同じ内容の質問」 と同じです。 もし書くとしても議論についての提示を行ってください。 「意図した通りに動いているが、自分で作ったわけではないので動作を十分に把握していないプログラムの詳細な動きを理解したい」 それは他人がする事ではなく質問者様自身が行うべきことです。もし違う事書かれて納得しましたか? 私が指摘したコメント欄について納得しましたか?widthについては指摘が誤っていましたが、他の指摘は間違いがありませんが。 > 解釈が違うのか、プログラムが間違えている あなたのプログラム解釈については一部誤りがあります。理由は人の内容を単純にコピペし判定等の意味合いを理解できる能力に欠けているからです。 これでよろしいかな?
ot1982

2020/10/02 01:05

わかりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問