pythonでexcelの列幅を自動調整するプログラムを読み解いてみて、1行ずつ何をしているのか
コメントに書き出してみたのですが、その考えが正しいか確認したいです。
まず、下図のようなexcelがあります。
一部文字列が、セルに収まっていないので、列幅を自動調整するためのプログラムを色々調べて
作成し、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文のところがあまり自信ないですが、考えが正しいのか確認したいです。
どなたかお分かりになる方、ご教授よろしくお願いいたします。
コメントで気になったのが
> 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の列幅として設定する。
ちなみにwidthの単位はピクセル
文字数 * 1.2でも10文字で12ピクセルで全然足りないですよ
0.75ポイント = 1ピクセルなので
文字が12ポイントで描写されていたら1文字辺り
12ポイント / 0.75ポイント = 16ピクセル
16ピクセル*10文字=160ピクセルになります。
タグに「文字コード」がありますが本質問に関係ありますか?
すみません、専門用語に疎く、タグに文字コードの意味が分かっていないのですが、どこのことを言っていますか?
この質問の一番上が
トップ > Pythonに関する質問 My Python My Excel My 文字コード
という表示になっているでしょ?
これ質問者様が質問の記載の時「文字コード」をタグとして書いたから表示されています。
(タイトルの次の項目)
でも「文字コード」今回の質問に関係ないから、質問のタグから削除したほうが良いよというお話。
kuma_kuma_さん
ご教授ありがとうございます。ピクセルのところは、解釈が違うのか、プログラムが間違えているかと言うとどちらになるのでしょうか。またコメント頂いた箇所以外は概ね正しい考えなのでしょうか。
> ピクセルのところは、解釈が違うのか、プログラムが間違えているか
これは本来質問者様がどんな意図(事)をしたいかで変わってきます。
(前回は指摘する前に閉じられたから答えようがなかった。)
今回コメントを拝見するに辺り「文字数の最大に合わせたかった」という事が判ったので書きこんだわけです。
ますお答えいただいていないのですが結果として、質問者様がしたい事とwidthの指摘事項は合致したのですか?
そこが判らないと何とも答えられません。
タイトルのことですね、文字コードは関係ないので消しました。
それと、ピクセルのところのコードは、各列ごとに最大の文字数を見つけて、その文字数がセルに収まるように列幅を調整するようにしたくて組んでいます。
はい
> 各列ごとに最大の文字数を見つけて、その文字数がセルに収まるように列幅を調整するようにしたくて組んでいます。
これはコメントで書かれていたので理解できました。
それに対してwidthの値が小さすぎではないですか?単位間違っていませんか?とここで書きました。
結果質問者様はその内容を読んでどうされましたか?
・そうか!と思って直して動かした
・いやそんなことはない!と思って何もしていない。
・意味不明だから放置している
等どうしたかというお答えがないので答えようがないのです。
ええと、widthの単位は(Excelのセルの幅と同様に)ピクセルじゃないですよ。
実際にコード動かしてみました?
実際にプログラム実行すると、セルに収まるように列幅が調整できています。
ごめんね。あなたにではなく、「widthはピクセル単位」と主張しているkuma_kuma_さん向けの発言です。
こちらの手元でも、実際にプログラムを実行して、(半角文字であれば)セルに収まるように列幅が調整できているのを確認しています。
Daregadaさんへ
こちらpythonでのExcel操作ができる環境がすぐ構築できないのでVBAで確認しています。
(その為正式回答欄に書いていません)
pythonの場合違いましたか?
プログラムは意図したように動いたので、単位が間違えていませんか?の意味が分からず、何も修正していないです。
> 実際にプログラム実行すると、セルに収まるように列幅が調整できています。
それであれば問題ないです。
まずは私の「widthの単位が違うのではないか?」という点に関して取り下げさせてもらいます。
誤解を招き申し訳ございません。
ただそうすると質問者様はなにを目的にこの質問を上げたのですか?
処理は正しく動いている。コメントの指摘はしましたが不備とまでいえないレベル
という事は質問者様がはじめ想定した内容を実行確認し再度コメント追加で確認までされている...
考えが正しいことはすでに証明されているのでは?
どう見ても、Excelの幅の指定と同じ単位(標準のフォントとサイズをベースにした文字単位)ですね。VBAで確認って、それ確認しているとは言えませんよね。少なくとも、openpyxlのAPIドキュメントぐらいは見ないと。
質問者が基にしたコードは、2012年にstack overflowに書かれた質問への返答(2013年)で、openpyxlのバージョンが古いため、現在の3系では動きませんが(質問者の前の質問がそれ)、列幅の設定自体は現在でも通用します。「もっといい幅の調整方法があるぞ」という投稿も含めて以下を参照。
https://stackoverflow.com/questions/13197574/openpyxl-adjust-column-width-size/35790441
Daregadanさん、ちょっと失礼すぎますよ。
確かに誤った回答にはなっていますが、少なからず確認はしたが正確な確認ができないからこちらに記載
さらに誤り認めて謝罪までしている人に対して本当に失礼ですね。
>「もっといい幅の調整方法があるぞ」という投稿も含めて以下を参照。
じゃなぜ今ここに書く。前の質問をそこまで把握しているなら前の時点で答えなよ?
さらにきちんとした「回答」欄あるだろうそっちに書け!
そうしたら回答済みなので余計な心配もしなくてすむわ!
こちらは前の質問や結果などは知りません。
ただここで再質問しているから結果がうまくいってないのでは?と思い可能性を書いたまで!
質問者様が困っているのではないか?うまくいかないのであればこういう点はどうですか?と書くのが何が悪い!調子にのるな!
いや、以下を参照って、2013年からstack overflowで議論されているよ、って話ですが。
前の質問は、そのコードがうまく動かないのはなぜ、という質問で、openpyxlのバージョンアップで仕様が変わったから、と回答して解決済みです。
この質問は、「意図した通りに動いているが、自分で作ったわけではないので動作を十分に把握していないプログラムの詳細な動きを理解したい」という内容で、エラーメッセージや困っていることが書かれていないことからもそれは明らかですね。
質問を投稿した理由は、Daregadaさんがおっしゃられた通りです。それが理由で、自分なりに調べて1行ごとに何をやってるかコメントに書き出したので、そのコメントの考えが正しいのか確認したかったのです。これまでの頂いたご意見からすると、一部違うところがあったけど、概ね正しいと認識しました。色々教えていただきありがとうございました。
質問者様この質問がその内容なら
「過去に投稿した質問と同じ内容の質問」
と同じです。
もし書くとしても議論についての提示を行ってください。
「意図した通りに動いているが、自分で作ったわけではないので動作を十分に把握していないプログラムの詳細な動きを理解したい」
それは他人がする事ではなく質問者様自身が行うべきことです。もし違う事書かれて納得しましたか?
私が指摘したコメント欄について納得しましたか?widthについては指摘が誤っていましたが、他の指摘は間違いがありませんが。
> 解釈が違うのか、プログラムが間違えている
あなたのプログラム解釈については一部誤りがあります。理由は人の内容を単純にコピペし判定等の意味合いを理解できる能力に欠けているからです。
これでよろしいかな?
わかりました。ありがとうございました。
あなたの回答
tips
プレビュー