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

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

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

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

Q&A

解決済

1回答

1086閲覧

複数のエクセルブックを結合

shino_1222

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/06/12 13:12

編集2021/06/12 14:02

前提・実現したいこと

実現したいこと:pythonを使って複数のエクセルブックを結合
前提:エクセルブックの形式は全て同じ

【課題】
・エクセルブック全て、Sheet2のデータのみ結合(シート左から2番目)
・Sheet2のA列のデータには全てリンクが挿入されており、結合した際に変わらずリンクが挿入されている
・予め用意したエクセルブックに保存 ※保存の際、予め用意したエクセルブックの書式は崩さないこと

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

import numpy as np
import pandas as pd
import glob
file_list=glob.glob("data/*.xlsx")
df=pd.DataFrame()
for file in file_list:
df2=pd.read_excel(file,parse_dates=True,index_col=0)
df2=df2.replace(np.nan,' ',regex=True)
df=pd.concat([df,df2])
df.to_excel('結合.xlsx')

試したこと

ネットにアップされているコードを試してみた結果、結合はできました。
しかしSheet1が結合され、また、Sheet1を全て削除したことでSheet2のデータを結合することができましたが、
残念ながらA列のリンクが全て消えてしまいました。
保存については、結合したブックを新規で作成し保存するようなコードとなっておりました。
そのため、改めてエクセルシートに書式等を設定する必要がでてきます。
可能であれば、予め書式等を設定したエクセルシートに保存できればと考えます。

いろいろコードを調べて試みましたが、どれも上手くいきませんでした。
お力添えお願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

openpyxlを使った例になります。

DIFF

1from openpyxl import load_workbook 2import glob 3from copy import copy 4 5 6DEST_SHEET_NAME = 貼り付け先ファイルの貼り付け先シート名 7+KEYCELL = 0 # データが入っているか判定する列を指定(0始まり) 8 9dest_wb = load_workbook(filename='結合.xlsx') 10dest_ws = dest_wb[DEST_SHEET_NAME] 11 12file_list = glob.glob("data/*.xlsx") 13print(f"読み込み対象のファイルは{len(file_list)}件です。") 14k = 1 15for file in file_list: 16 wb = load_workbook(filename=file) 17 print(f"{file}を読み取り中...") 18 ws = wb['Sheet2'] 19 for row in ws.rows: 20+ if row[KEYCELL].value is None: 21+ continue 22 for c, cell in enumerate(row): 23 dest_ws.cell(column=c+1, row=k, value=cell.value) 24 if cell.has_style: 25 new_cell = dest_ws.cell(column=c+1, row=k) 26 new_cell.font = copy(cell.font) 27 new_cell.border = copy(cell.border) 28 new_cell.fill = copy(cell.fill) 29 new_cell.number_format = copy(cell.number_format) 30 new_cell.protection = copy(cell.protection) 31 new_cell.alignment = copy(cell.alignment) 32 new_cell.hyperlink = copy(cell.hyperlink) 33 k = k+1 34 35dest_wb.save('結合.xlsx') 36print("処理が完了しました")

投稿2021/06/12 15:13

編集2021/06/14 13:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shino_1222

2021/06/13 11:02 編集

ご回答ありがとうございます。 コードを貼り付け、貼り付け先ファイルの貼り付け先シート名に"まとめ"と入力し実行しましたが、 残念ながら上手くいきませんでした(結合先シート名:まとめ)。 実行状況は、結合するブック(ブック名:結合)のシート(シート名:まとめ)に何も変化が起きませんでした。 なにか考えられる原因がありましたらご教示いただけましたら幸いです。
退会済みユーザー

退会済みユーザー

2021/06/13 11:07

うまく行かなかったとのことですが、エラーは表示されなかったのでしょうか。 考えられるのは、読み込みディレクトリが違っており、fileそのものが読み込まれていない可能性です。 ファイルの読み込み状況を表示するようにコードを一部修正しました。 「読み込み対象のファイルは0件です」と表示される場合は、読み込み対象フォルダの指定が違っている可能性があります。 glob.glob("data/*.xlsx") の部分を見直してみてください。
shino_1222

2021/06/13 12:31 編集

早速ご回答ありがとうございます。 新たなコードで実行したところ「読み込み対象ファイルは0件です」と表示されました。 確認したろころ、私の入力が誤っておりました。ありがとうございます。 最後に1点ですが、結合ができ、シートの書式の変更もありませんでしたが、A列のリンクが機能しません。 見た目は文字が青くリンクが挿入されているように見えますが、実際は飛べません。 解決策はありますでしょうか? よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/06/13 12:36

リンクというのは他のシート等へのリンクではなくブラウザで見るハイパーリンクのことでしょうか? ソースを修正しました。
shino_1222

2021/06/13 14:07

迅速なご対応ありがとうございます。 リンクはブラウザで見るハイパーリンクのことです。言葉足らずで失礼しました。 早速実行した結果、ハイパーリンクが挿入されていました。無事に課題解決です。 再三ご対応いただき感謝申し上げます。ありがとうございました。
shino_1222

2021/06/13 16:21

たびたびすみません。 ハイパーリンクは解決したのですが、よく確認すると結合が上手くいっておりませんでした。 複数のエクセルブックの読み取りは成功していますが、結合したエクセルブックを確認すると 上から連続で結合されているわけではなく、ブックとブックの間に空白のセルが数百行と存在します。 例)行2~100はデータがあり(ブック1)、行101~200まで空白、行201~230までデータあり(ブック2)のような感じです。改善できますでしょうか? なにからなにまですみません。お力添えいただけますと幸いです。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/06/14 13:16 編集

空白行を無視するように修正しました(回答欄。先頭の「+」は実際に使うときは除去してください。どこを追加したかわかりやすいようにしています) 「KEYCELL」には、空白行かどうかを判定する列の列数を、ゼロ始まりで指定してください。 たとえばA列なら0、B列なら1、C列なら2・・・です。 KEYCELLに指定した列が空白となっている行は結合対象から除外します。
shino_1222

2021/06/14 14:23

ご対応ありがとうございます。 試した結果、空白なく結合されておりました。 何度もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問