Python Excelファイル内複数シート 範囲コピーを新規Excelファイルに貼り付けたい
現状、会社でExcelでの部署別予算管理をしています。
各Excelファイル(課単位=約30)を別ファイル内シート別に値を代入して集計予算を作成しています。
単純作業を自動化できないかとPythonを勉強中です。
様々なサイトから参考になりそうなソースをコピーして工夫していますが中々、思い通りの動きをしてくれません。
発生している問題・エラーメッセージ
特定のフォルダ内に格納されているExcelファイルは全て同じフォーマット形式になっています。
入力部分のセル範囲(例:U6:AF163)をコピーして、リスト化する事はできましたが、そのリストを新規Excelに
貼り付けするところでエラーがでてしまいます。
一時リストを新規Excelに張り付ける良い方法はありませんでしょうか?
該当のソースコード
from openpyxl import load_workbook
import pandas as pd
import glob
**エクセルファイルのロード
**特定フォルダ内にある.xlsxファイルを全て読取る
export_folder_path = 'C:\Users\xxxxxxxxx_経理案件_各CC予算自動集計\①.CC格納場所'
**ファイルのパスを作成 該当フォルダ内の全てのxlsxファイルを全て読み込む
ex_path = export_folder_path + '/' + '*.xlsx'
file_path = glob.glob(ex_path)
for x in file_path:
print("x =",x)
wb = load_workbook(filename = x, data_only=True)
**対象シートのロード
ws = wb['④入力sheet【予算集計】']
cell_cc_chk = ws.cell(column=2, row=2).value
print ("cell_cc_chk = ",cell_cc_chk)
for row in ws["U6:AF163"]:
values =[]
for col in row:
values.append(col.value)
print(values)
ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
・python3.6
・jupyter lab
初めての質問投稿になります。
詳しい皆様どうかよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
試してみたら以下のエラーが出ました。
raise ValueError("Cells cannot be copied from other worksheets")
あるシートから別のシートへのセル丸ごとのコピーは出来ないようです。
一つずつ地道に値を設定するしかなさそうです。
インターネットで調べてみても各々独自にコピー処理を組んでいるようでした。
以下range_copyという関数をつくってみました。
Python3
1from openpyxl import load_workbook,Workbook 2 3# 第1引数:入力シートのオブジェクト 4# 第2引数:コピー元の始点(左上のセル)のアドレス(A1形式) 5# 第3引数:コピー元の終点(右下のセル)のアドレス(A1形式) 6# 第4引数:出力シートのオブジェクト 7# 第5引数:コピー先の始点(左上のセル)のアドレス(A1形式) 8def range_copy(source_worksheet, source_initial_cell_address, source_terminal_cell_address, target_worksheet, target_initial_cell_address): 9 target_initial_cell = target_worksheet[target_initial_cell_address] 10 target_initial_row = target_initial_cell.row 11 target_initial_column = target_initial_cell.column 12 for row in source_worksheet[source_initial_cell_address + ':' + source_terminal_cell_address]: 13 for cell in row: 14 target_worksheet.cell(target_initial_row + cell.row - 1, target_initial_column + cell.column - 1).value = cell.value 15 16 17 18filename1 = 'C:~~~~\sample1.xlsx' 19wb1 = load_workbook(filename = filename1, data_only=True) 20ws1 = wb1['Sheet1'] 21 22filename2 = 'C:~~~~\sample2.xlsx' 23wb2 = Workbook() 24ws2 = wb2.create_sheet() 25 26 27range_copy(ws1, 'a1', 'c5', ws2, 'a1') 28 29wb2.save(filename=filename2)
投稿2020/12/30 05:09
退会済みユーザー
総合スコア0
0
【自己解決済】各課予算データ(同一ファイル内にある別xlsxファイルを集計xlsxファイルシート別)をまとめる
from pathlib import Path from openpyxl import load_workbook,Workbook import os import openpyxl as px import pprint Path_is = Path('C:~~~~\①.CC格納場所') print('Path_is_a=',Path_is) fill = px.styles.PatternFill(patternType='solid',fgColor ='D1FE7B',bgColor='D1FE7B') #セル書式変更 wb_new = Workbook() ws_new = wb_new.active ws_new.title = 'tmp_cc_summary' ws_new['B1'].fill = fill ; ws_new['B1']= '4月' ws_new['C1'].fill = fill ; ws_new['C1'] = '5月' ws_new['D1'].fill = fill ; ws_new['D1'] = '6月' ws_new['E1'].fill = fill ; ws_new['E1'] = '7月' ws_new['F1'].fill = fill ; ws_new['F1'] = '8月' ws_new['G1'].fill = fill ; ws_new['G1'] = '9月' ws_new['H1'].fill = fill ; ws_new['H1'] = '10月' ws_new['I1'].fill = fill ; ws_new['I1'] = '11月' ws_new['J1'].fill = fill ; ws_new['J1'] = '12月' ws_new['K1'].fill = fill ; ws_new['K1'] = '1月' ws_new['L1'].fill = fill ; ws_new['L1'] = '2月' ws_new['M1'].fill = fill ; ws_new['M1'] = '3月' z = 0 for i , file in enumerate(Path_is.glob('*.xlsx')): for ws in enumerate(Path_is.glob('*.xlsx')): wb = load_workbook(file, data_only=True) wb.active ws = wb['④入力sheet【予算集計】'] row_no = i + 3 def get_value_list(t_2d): return([[cell.value for cell in row] for row in t_2d]) l_2d = get_value_list(ws['U6:AF163']) # 対象シート内セルの値取得_CC番号を取得して後ほどSetする側の特定に紐づける cell_cc_chk = ws.cell(column=2, row=2).value ws_new = wb_new.worksheets[z] ws_new.title = str(cell_cc_chk) #get_value_listよりCCを指すB2セル値をシートにセットする def write_list_2d(ws_new, l_2d, start_row,start_col): for y, row in enumerate(l_2d): for x, cell in enumerate(row): ws_new.cell(row=start_row + y, column=start_col + x, value=l_2d[y][x]) write_list_2d(ws_new, l_2d, 2, 2) #row=2, col=2を始点に書き込み ws_cc = wb_new.copy_worksheet(ws_new) ws_cc.title = 'copy_test' z = z + 1 print ("★cell_cc_chk = ",cell_cc_chk) print('★l_2d = ', l_2d) wb_new.save('C:~~~~\②.部門格納場所\tmp_cc_summary.xlsx')
投稿2021/01/06 06:36
総合スコア1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
(自己解決済)各課予算データ(同一ファイル内にある別xlsxファイルを集計xlsxファイルシート別)をまとめる
from pathlib import Path from openpyxl import load_workbook,Workbook import os import openpyxl as px import pprint Path_is = Path('C:~~~~\①.CC格納場所') print('Path_is_a=',Path_is) fill = px.styles.PatternFill(patternType='solid',fgColor ='D1FE7B',bgColor='D1FE7B') #セル書式変更 wb_new = Workbook() ws_new = wb_new.active ws_new.title = 'tmp_cc_summary' ws_new['B1'].fill = fill ; ws_new['B1']= '4月' ws_new['C1'].fill = fill ; ws_new['C1'] = '5月' ws_new['D1'].fill = fill ; ws_new['D1'] = '6月' ws_new['E1'].fill = fill ; ws_new['E1'] = '7月' ws_new['F1'].fill = fill ; ws_new['F1'] = '8月' ws_new['G1'].fill = fill ; ws_new['G1'] = '9月' ws_new['H1'].fill = fill ; ws_new['H1'] = '10月' ws_new['I1'].fill = fill ; ws_new['I1'] = '11月' ws_new['J1'].fill = fill ; ws_new['J1'] = '12月' ws_new['K1'].fill = fill ; ws_new['K1'] = '1月' ws_new['L1'].fill = fill ; ws_new['L1'] = '2月' ws_new['M1'].fill = fill ; ws_new['M1'] = '3月' z = 0 for i , file in enumerate(Path_is.glob('*.xlsx')): for ws in enumerate(Path_is.glob('*.xlsx')): wb = load_workbook(file, data_only=True) wb.active ws = wb['④入力sheet【予算集計】'] row_no = i + 3 def get_value_list(t_2d): return([[cell.value for cell in row] for row in t_2d]) l_2d = get_value_list(ws['U6:AF163']) # 対象シート内セルの値取得_CC番号を取得して後ほどSetする側の特定に紐づける cell_cc_chk = ws.cell(column=2, row=2).value ws_new = wb_new.worksheets[z] ws_new.title = str(cell_cc_chk) #get_value_listよりCCを指すB2セル値をシートにセットする def write_list_2d(ws_new, l_2d, start_row,start_col): for y, row in enumerate(l_2d): for x, cell in enumerate(row): ws_new.cell(row=start_row + y, column=start_col + x, value=l_2d[y][x]) write_list_2d(ws_new, l_2d, 2, 2) #row=2, col=2を始点に書き込み ws_cc = wb_new.copy_worksheet(ws_new) ws_cc.title = 'copy_test' z = z + 1 print ("★cell_cc_chk = ",cell_cc_chk) print('★l_2d = ', l_2d) wb_new.save('C:~~~~\②.部門格納場所\tmp_cc_summary.xlsx')
投稿2021/01/06 06:35
総合スコア1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
from pathlib import Path from openpyxl import load_workbook,Workbook import os import openpyxl as px import pprint Path_is = Path(('C:~~~~\①.CC格納場所')) print('Path_is_a=',Path_is) for i , file in enumerate(Path_is.glob('*.xlsx')): fill = px.styles.PatternFill(patternType='solid',fgColor ='D1FE7B',bgColor='D1FE7B')#セル書式変更 wb_new = Workbook() ws_new = wb_new.active ws_new.title = 'tmp_cc_summary' ws_new['B1'].fill = fill ; ws_new['B1']= '4月' ws_new['C1'].fill = fill ; ws_new['C1'] = '5月' ws_new['D1'].fill = fill ; ws_new['D1'] = '6月' ws_new['E1'].fill = fill ; ws_new['E1'] = '7月' ws_new['F1'].fill = fill ; ws_new['F1'] = '8月' ws_new['G1'].fill = fill ; ws_new['G1'] = '9月' ws_new['H1'].fill = fill ; ws_new['H1'] = '10月' ws_new['I1'].fill = fill ; ws_new['I1'] = '11月' ws_new['J1'].fill = fill ; ws_new['J1'] = '12月' ws_new['K1'].fill = fill ; ws_new['K1'] = '1月' ws_new['L1'].fill = fill ; ws_new['L1'] = '2月' ws_new['M1'].fill = fill ; ws_new['M1'] = '3月' wb = load_workbook(file, data_only=True) wb.active ws = wb['④入力sheet【予算集計】'] row_no = i +3 def get_value_list(t_2d): return([[cell.value for cell in row] for row in t_2d]) l_2d = get_value_list(ws['U6:AF163'])# 対象シート内セルの値取得_CC番号を取得して後ほどSetする側の特定に紐づける cell_cc_chk = ws.cell(column=2, row=2).value for ws in enumerate(Path_is.glob('*.xlsx')): ws_new.title = str(cell_cc_chk) #get_value_listよりCCを指すB2セル値をシートにセットする def write_list_2d(ws_new, l_2d, start_row,start_col): for y, row in enumerate(l_2d): for x, cell in enumerate(row): ws_new.cell(row=start_row + y, column=start_col + x, value=l_2d[y][x]) write_list_2d(ws_new, l_2d, 2, 2) #row=2, col=2を始点に書き込み ws_cc = wb_new.copy_worksheet(ws_new) ws_cc.title = 'copy_test' print ("★cell_cc_chk = ",cell_cc_chk) print('★l_2d = ', l_2d) wb_new.save(('C:~~~~\②.部門格納場所\tmp_cc_summary.xlsx')
投稿2021/01/05 00:26
編集2021/01/06 03:56総合スコア1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/06 03:23
退会済みユーザー
2021/01/06 03:32
2021/01/06 04:05
2021/01/06 06:39
退会済みユーザー
2021/01/06 11:11
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/05 00:25
退会済みユーザー
2021/01/05 09:11
2021/01/06 01:56