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

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

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

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

Python

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

Q&A

解決済

1回答

2711閲覧

空白のセルとその横のセルを結合する

katsumasa35

総合スコア4

openpyxl

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

Python

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

0グッド

0クリップ

投稿2020/09/02 01:14

編集2020/09/02 01:24

前提・実現したいこと

空白のセルとその横のセルを結合する

・ここに質問の内容を詳しく書いてください。
pythonでエクセルのデータを抜き出すプログラムを作成しています。
その際、空白のセルがあると抜き出しづらいので、文字の入ったセルと結合したいと考えております。

発生している問題

エラーメッセージ
'Traceback (most recent call last):
File "C:\Users\jimuark2020-3\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\descriptors\base.py", line 55, in _convert
value = expected_type(value)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 8, in <module>
File "C:\Users\jimuark2020-3\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\worksheet.py", line 587, in merge_cells
cr = CellRange(range_string=range_string, min_col=start_column, min_row=start_row,
File "C:\Users\jimuark2020-3\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\worksheet\cell_range.py", line 56, in init
self.min_row = min_row
File "C:\Users\jimuark2020-3\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\descriptors\base.py", line 105, in set
value = _convert(self.expected_type, value)
File "C:\Users\jimuark2020-3\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\descriptors\base.py", line 57, in _convert
raise TypeError('expected ' + str(expected_type))
TypeError: expected <class 'int'>'

該当のソースコード

Python
ソースコード
'import openpyxl
import tkinter, tkinter.filedialog, tkinter.messagebox
import os

root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname("file"))
tkinter.messagebox.showinfo('キーワード抽出','抽出するファイルを選択してください')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
tkinter.messagebox.showinfo('キーワード抽出',file)

wb = openpyxl.load_workbook(file)
ws = wb['Sheet1']
for rows in ws['A1':'L30']:
for cell in rows:
if cell.value == None:
cell.value = cell.value
else:
cell.value = cell.value.replace(" ", "")

for rows in ws['A1':'L30']:
for cell in rows:
if cell.value == None:
h = cell.coordinate
g = cell.row
n = cell.column
k = ws.cell(row =g, column =n+1).coordinate
ws.merge_cells('h:k')
wb.save(file)'

試したこと

ws.merge cells('h:k')
の部分のクオーテーションの位置を変えたり、コロンをコンマにするなどいろいろ試しましたが別のエラーメッセージが出てきて駄目でした。
おそらく文字と数値の混合によるエラーであると思うのですが、解決方法がわかりません。詳しい方がいらっしゃいましたら、教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

文字と数値の混合ではなくて結合には列と行の情報両方がいるからです。
現状の指定では列情報はありますが行情報がありません。
これで各行のHからK列の結合ができるようになります。

python

1for rows in ws['A1':'L30']: 2 for cell in rows: 3 if cell.value == None: 4 h = cell.coordinate 5 g = cell.row 6 n = cell.column 7 k = ws.cell(row =g, column =n+1).coordinate 8 ws.merge_cells(f'h{cell.row}:k{cell.row}') 9

投稿2020/09/02 02:01

yureighost

総合スコア2183

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

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

katsumasa35

2020/09/02 02:25

言われたとおりのソースコードを試しましたが、別のエラーが発生しました。 ’Traceback (most recent call last): File "<stdin>", line 9, in <module> File "C:\Users\jimuark2020-3\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\workbook\workbook.py", line 392, in save save_workbook(self, filename) File "C:\Users\jimuark2020-3\AppData\Local\Programs\Python\Python38-32\lib\site-packages\openpyxl\writer\excel.py", line 291, in save_workbook archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True) File "C:\Users\jimuark2020-3\AppData\Local\Programs\Python\Python38-32\lib\zipfile.py", line 1250, in __init__ self.fp = io.open(file, filemode) PermissionError: [Errno 13] Permission denied: 'C:/Users/jimuark2020-3/Desktop/pumppump.xlsx'’
katsumasa35

2020/09/02 02:30

後もう一点、 このhとkは変数なのですが、H列とK列とはどういうことでしょうか。 無知ですいません。
yureighost

2020/09/02 02:45 編集

エラーは権限エラーなので対象のExcelファイルを開いたまま実行していませんか? またhとkが変数のつもりでしたら現状変数ではなく文字列として認識されています。 変数として使いたいなら ws.merge_cells(f'{h}:{k}') このように変数埋め込みをしないといけません。
katsumasa35

2020/09/02 02:47

エクセルのファイルを開いたままコードを入力しているだけでした。 申し訳ありません。 おそらく実行には成功したのですが、エクセルを起動すると、 「一部の内容に問題が見つかりました。可能な限り内容を回復しますか? 」との表示が現れ、「はい」をクリックすると、元のデータのままになります。解決法はありますか?
yureighost

2020/09/02 02:57

hとkを変数として認識させて実行した動きを見た分では セルを一つ一つ走査して結合しているので、 まずA1とB1を結合する部分は問題がありませんが、 次のA1と結合した後のB1とC1を結合しているのは問題です。 そういった処理がファイルの破損に繋がってしまっていると思われます。 例えばA1からL1を全て結合する想定なら その範囲を一括で結合するように処理する必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問