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

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

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

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

受付中

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

ot1982
ot1982

総合スコア0

Python

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

0回答

-1評価

0クリップ

92閲覧

投稿2020/10/01 10:09

編集2022/01/12 10:55

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

kuma_kuma_
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_
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_
meg_

2020/10/01 10:49

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

2020/10/01 11:30

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

2020/10/01 11:48 編集

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

2020/10/01 11:47

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

2020/10/01 11:56

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

2020/10/01 12:16

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

2020/10/01 12:35

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

2020/10/01 13:07 編集

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

2020/10/01 14:03

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

2020/10/01 14:06 編集

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

2020/10/01 14:07

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

2020/10/01 14:13

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

2020/10/01 14:16

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

2020/10/01 15:31

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

2020/10/01 17:46 編集

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

2020/10/01 18:04

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

2020/10/01 21:28

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

2020/10/02 00:37

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

2020/10/02 01:05

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python

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