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

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

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

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

Python

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

Q&A

解決済

2回答

1851閲覧

【python】openpyxlを使って、Excelデータをテキストファイルに移植して、テキストファイルを量産したい

yujin1202

総合スコア61

openpyxl

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

Python

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

0グッド

0クリップ

投稿2021/05/18 07:20

編集2021/05/18 15:12

PythonのOpenpyxlを使って、Excelデータをテキストファイルに移植して、テキストファイルを量産したいと思っております。
(御参考として、最終操作対象となるHTMLファイル全体は下部に記載しておきます。)

Excelから、HTMLの各要素を引っ張り、下記の様な<div>~</div>までを200セットを量産したいと思っております。
===========

<div> <label for="ck1">Afgahanistan:</label> <input type="checkbox" id="ck1" name="checkbox" value="Afgahanistan"> </div> ==========

もう少し説明すると、下記の様なエクセルがあります(実際は、200か国です)。
上記のHTML書式に合わせて、"ck2"は、"Albania"なので、valueも変えて下記の様に書いたテキストを、200か国分、量産してゆきたいです。

===============================

<div> <label for="ck2">Albania:</label> <input type="checkbox" id="ck2" name="checkbox" value="Albania"> </div> ==============

<元になるエクセルファイル>
イメージ説明

勿論、200か国分のデータを手でコピペしたり、エクセルで関数を組んでぐちゃぐちゃやれば、テキストファイルの量産は可能ですが、Openpyxlを使って、量産したいと思っております。
大きな処理の流れでも、教えて頂ければ、助かります。
よろしくお願いします。

<後日の解決策>
ppaulさんのコメントの通り、Pythonの標準機能のf文字列で処理できました。
エクセル上で、TEXTJOIN関数を使い、["ck1","ck2","ck3","ck4",・・・・・ck18","ck19","ck20"]とかを編集する必要はありましたが。。。

下記が、Pythonコードになります。(これを走らせると、テキストファイルが自動で量産できます。)

i=0 for i in range(20): id = ["ck1","ck2","ck3","ck4","ck5","ck6","ck7","ck8","ck9","ck10","ck11","ck12","ck13","ck14","ck15","ck16","ck17","ck18","ck19","ck20"] country = ["Afghanistan","Albania","Algeria","Andorra","Angola","Anguilla","Antigua & Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize"] pattern = ''' <div> <label for={}>{}:</label> <input type="checkbox" id="{}" name="checkbox" value="{}"> </div>''' print(pattern.format(id[i], country[i], id[i], country[i])) i=i+1

<御参考。編集対象のHTML>

<!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>test</title> </head> <body> <h1>Test</h1> <p>Where do you want to go ???</p> <form action="/" method="POST" enctype="multipart/form-data"> <div> <p>Select at least one(1) country.</p> </div> <br> <div> <label for="ck1">Afgahanistan:</label> <input type="checkbox" id="ck1" name="checkbox" value="Afgahanistan"> </div> <div> <label for="ck2">Albania:</label> <input type="checkbox" id="ck2" name="checkbox" value="Albania"> </div> <div> <label for="ck3">Algeria:</label> <input type="checkbox" id="ck3" name="checkbox" value="Algeria"> </div> <div> <label for="ck4">Andorra:</label> <input type="checkbox" id="ck4" name="checkbox" value="Andorra"> </div> <div> <input type="submit" value="SEND"> </div> </form> <br> <br> <p> Your selected countries are belows.</p> <p> ↓ ↓ ↓</p> <p id="msg"></p> <script> function valueChange(){ let res=[]; res.push(ck1.checked?'afganistan':''); res.push(ck2.checked?'Albania':''); res.push(ck3.checked?'Algeria':''); res.push(ck4.checked?'Andorra':''); msg.innerHTML=res.join("<br>"); } let ck1= document.getElementById('ck1'); ck1.addEventListener('change',valueChange); let ck2= document.getElementById('ck2'); ck2.addEventListener('change',valueChange); let ck3= document.getElementById('ck3'); ck3.addEventListener('change',valueChange); let ck4= document.getElementById('ck4'); ck4.addEventListener('change',valueChange); let msg = document.getElementById('msg'); </script> </body> </html>

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

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

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

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

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

ppaul

2021/05/18 07:31

知りたいのは、opepyxlの使い方ですか。それとも、取ったデータをテキストに埋め込む方法ですか。
yujin1202

2021/05/18 08:39

コメントをありがとうございます。Openpyxlで、文字を切り取るのはできるのですが(openpyxlの普通の使い方ですよね。)、それをテキストに埋め込む方法と言うのが分かりません。 そもそも、Openpyxlと言うのは、ExcelとかCSVを操作するライブラリーなので、テキストに埋め込む際には、何かしら別のテクニックが必要なのでは? と言う気もするのですが、如何でしょうか?
guest

回答2

0

ベストアンサー

文字列に別のデータを埋めこむには、str.formatメソッドを使うか、それより簡単に使えるフォーマット済み文字列リテラルを使います。

公式ドキュメントは以下ですが、
str.format(*args, **kwargs)
2.4.3. フォーマット済み文字列リテラル

読みにくいので、

Python, formatで書式変換(0埋め、指数表記、16進数など)
Pythonのf文字列(フォーマット済み文字列リテラル)の使い方
を読まれた方がわかりやすいと思います。

こういう感じで使います。

python

1>>> id = "ck1" 2>>> country = "Afgahanistan" 3>>> pattern = '''<div> 4... <label for={}>A{}:</label> 5... <input type="checkbox" id="{}" name="checkbox" value="{}"> 6... </div>''' 7>>> 8>>> print(pattern.format(id, country, id, country)) 9<div> 10<label for=ck1>AAfgahanistan:</label> 11<input type="checkbox" id="ck1" name="checkbox" value="Afgahanistan"> 12</div>

投稿2021/05/18 11:28

ppaul

総合スコア24670

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

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

yujin1202

2021/05/18 15:14

ありがとうございました。 「エクセルのConcatenate関数を使わないとダメか?」と思って、pywin32ライブラリーでやりかけたのですが、f文字列の方が、シンプルですね。 解決しました。ベストアンサーとさせて頂きます
guest

0

エクセルシートから情報を読み出し、htmlフォーマットのテキストファイルを出力するという意図でしょうか。

大きな処理の流れでも

基本的には、openpyxlでエクセルを開き、所定のシートの内容を読み出す。
取得した情報(ckとCountryのペア)を元に、所定のフォーマット(html)に合わせて文字列を作成
適宜ファイル名を設定して、生成した文字列をテキストファイルに書き出せばよろしいかと。

投稿2021/05/18 07:55

t_obara

総合スコア5488

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

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

yujin1202

2021/05/18 09:06

早速のコメントをありがとうございます。 大まかな流れに沿うならば、多分ですが、エクセルのConcatenate関数を使う事になると考えます。そうなると、Openpyxlではなく、pywin32を使うのでは? と言う気がしてきました。pywin32でやってみますね。取り急ぎ、お礼まで。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問