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

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

ただいまの
回答率

87.49%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,064

score 7

実施していること

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • qnoir

    2021/01/27 10:01

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

    キャンセル

  • Zhiye

    2021/01/27 12:29

    ご指摘頂きありがとうございました。

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

    お手数をおかけしますが、ご確認のほど宜しくお願い致します。

    キャンセル

回答 1

checkベストアンサー

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)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • トップ
  • Pythonに関する質問
  • Excel内の表をカテゴリ別に分割して別のファイルに保存した後、別ファイルの文字列をコピー&ペースト