🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
openpyxl

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2926閲覧

Excel内の表をカテゴリ別に分割して別のファイルに保存した後、別ファイルの文字列をコピー&ペースト

Zhiye

総合スコア7

openpyxl

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/01/26 23:28

実施していること

ExcelをPythonで自動化したいと思い、現在Pythonを勉強中です。
下記の作業を自動化したいと考えています。
![イメージ説明

①ファイル名:管理_202101-XXXX内にある表を、部門別にA、B、Cに分割
②分割したA、B、Cの表を別ファイルで保存する
・ファイル名:管理_202012-A
・ファイル名:管理_202012-B
・ファイル名:管理_202012-C

上記を実施するために、下記の通り考えています。

①ファイル名:管理_202101-XXXX内にある表をfor文で分類
②分類したものを、部門の名前及び月名を前月になるようなファイル名にしてExcel生成
③Excel内にある'XXXXX'(6行目までの文面)を生成したExcelに挿入

import pandas as pd import re import datetime from dateutil.relativedelta import relativedelta import_file_path = 'C:\Users\管理_202101-XXXX.xlsx' excel_sheet_name = 'Sheet1' export_file_path = 'C:\Users\作成データ' now = datetime.datetime.now() last_month = now - relativedelta(months=1) # 説明文(XXXXXXXX・・・)の6行をskiprowsで読み込まない df_order = pd.read_excel(import_file_path, skiprows=6, sheet_name=excel_sheet_name) # “部門(A、B、C)”で表を分類 division_name = df_order['部門'].unique() for i in division_name: df_order_division = df_order[df_order['部門'] == i] df_concat = pd.concat([df_order_division]) df_concat.to_excel(export_file_path+'\'+'管理_'+last_month.strftime('%Y%m')+'-'+i+'.xlsx')

困っていること

skiprowsで読み込まなかった6行を生成したExcelの文頭に挿入しようとするがうまくいかない状況

解決方法として、
・skiprowsで読み込まなかった6行分だけのExcel(ファイル名:表題のみ.xlsx)をopenpyxlで書き込み
・この“表題のみ”のExcelを“実施したいこと”で生成した各Excelに挿入すればよいのではないか、
と考えました。

コードを書きましたがうまくいかない状況です。
誠に申し訳ありませんが、アドバイスを頂ければ大変助かります。
宜しくお願い致します。

(上記実施していることの続き) import_file_path_02 = export_file_path+'\'+'管理_'+last_month.strftime('%Y%m')+'-'+i+'.xlsx' #コピー先のエクセルを読み込む wb1 = openpyxl.load_workbook(import_file_path_02) ws1 = wb1['Sheet1'] #コピー元のエクセルを読み込む wb2 = openpyxl.load_workbook('C:\Users\表題のみ.xlsx') ws2 = wb2['管理'] #コピー先の1行目から15行分を挿入 ws1.insert_rows(1,15) #コピー元のコピー範囲を指定して貼り付け for i in range(1,23): for j in range(1,15): copy = ws2.cell(row=i,column=j).value ws1.cell(row=i,column=j,value=copy) wb1.save(import_file_path_02)

環境

Python 3.7 :: Anaconda custom (64-bit)
pandas 1.05
Windows 10

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/27 01:01

「コードを書きましたがうまくいかない状況です」とのことですが、 現状のコードだと、何が、どのような状態になっているために「うまくいっていない」ということになるのでしょうか。 また、それに対して、本来期待する結果(こうあるべき)というのはどのようなものなのでしょうか。 それを具体的に質問欄に書いてください。
Zhiye

2021/01/27 03:29

ご指摘頂きありがとうございました。 ・現状コードで実施した場合:  -エラー表示はなく、pandasによる表の作成及びエクセルは分割されて作成されている  -ただし、期待していた行は挿入されておらず、“表題のみ.xlsx”内容のコピー&ペーストもできていない ・期待する結果  -上記分割されたエクセルの行頭6行目まで行が挿入され、かつ別ファイル“表題のみ.xlsx”の内容が貼り付けされている状態にしたい お手数をおかけしますが、ご確認のほど宜しくお願い致します。
guest

回答1

0

ベストアンサー

手元の環境で、質問文とほぼ同じ下記のコードでは、きちんと
最初の15行内に'XXXXX'(6行目までの文面)が挿入されたエクセルファイル3つが生成できました。

変えているのは、(テスト環境用のファイルパス部分以外に)
「(上記実施していることの続き)」以降をインデントしたことくらいです。

・各エクセルファイルがきちんと意図した名前で意図したフォルダに保存されているか
・途中途中でprint文をさしはさむなどして、うまくデータが渡っているか
を確認されてはいかがでしょうか。

手元環境:
Windows 10 Professional 20H2
python 3.8.6
openppyxl==3.0.5
xlrd==1.2.0
Visual Studio Code

import pandas as pd import xlrd import re import datetime import openpyxl from dateutil.relativedelta import relativedelta # refはテスト環境のフォルダ切り替え用なので、あまり気にしなくてよいです。 ref="C:" import_file_path = ref+'\Users\管理_202101-XXXX.xlsx' excel_sheet_name = 'Sheet1' export_file_path = ref+'\Users\作成データ' now = datetime.datetime.now() last_month = now - relativedelta(months=1) # 説明文(XXXXXXXX・・・)の6行をskiprowsで読み込まない df_order = pd.read_excel(import_file_path, skiprows=6, sheet_name=excel_sheet_name) df_order # “部門(A、B、C)”で表を分類 division_name = df_order['部門'].unique() division_name for i in division_name: df_order_division = df_order[df_order['部門'] == i] df_concat = pd.concat([df_order_division]) df_concat.to_excel(export_file_path+'\'+'管理_'+last_month.strftime('%Y%m')+'-'+i+'.xlsx') #---------(上記実施していることの続き) 以降 import_file_path_02 = export_file_path+'\'+'管理_'+last_month.strftime('%Y%m')+'-'+i+'.xlsx' #コピー先のエクセルを読み込む wb1 = openpyxl.load_workbook(import_file_path_02) ws1 = wb1['Sheet1'] #コピー元のエクセルを読み込む wb2 = openpyxl.load_workbook(ref+'\Users\表題のみ.xlsx') ws2 = wb2['管理'] #コピー先の1行目から15行分を挿入 ws1.insert_rows(1,15) #コピー元のコピー範囲を指定して貼り付け for i in range(1,23): for j in range(1,15): copy = ws2.cell(row=i,column=j).value ws1.cell(row=i,column=j,value=copy) wb1.save(import_file_path_02)

投稿2021/01/27 04:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問