大量のExcelファイル(200など)を持っています。あるワークシートから別のワークシートに特定のワークシートをコピーしたいのですが。私はいくつかの調査を行いましたが、Openpyxlでそれを行う方法を見つけることができませんでした
これは私がこれまでに開発したコードです
def copy_sheet_to_different_Excel(path_Excel_read,Sheet_name_to_copy,path_Excel_Save,Sheet_new_name):
''' Function used to copy one Excel sheet into another file.
def path_Excel_read,Sheet_name_to_copy,path_Excel_Save,Sheet_new_name
Input data:
1.) path_Excel_read: the location of the Excel file along with the name where the information is going to be saved
2.) Sheet_name_to_copy= The name of the Excel sheet to copy
3.) path_Excel_Save: The path of the Excel file where the sheet is going to be copied
3.) Sheet_new_name: The name of the new Excel sheet
Output data:
1.) Status= If 0, everything went OK. If 1, one error occurred.
Version History:
1.0 (2017-02-20): Initial version.
'''
status=0
if(path_Excel_read.endswith('.xls')==1):
print('ERROR - Excel xls file format is not supported by openpyxl. Please, convert the file to an XLSX format')
status=1
return status
try:
wb = openpyxl.load_workbook(path_Excel_read,read_only=True)
except:
print('ERROR - Excel file does not exist in the following location:\n {0}'.format(path_Excel_read))
status=1
return status
Sheet_names=wb.get_sheet_names() # We copare against the sheet name we would like to cpy
if ((Sheet_name_to_copy in Sheet_names)==0):
print('ERROR - Excel sheet does not exist'.format(Sheet_name_to_copy))
status=1
return status
# We checking if the destination file exists
if (os.path.exists(path_Excel_Save)==1):
#If true, file exist so we open it
if(path_Excel_Save.endswith('.xls')==1):
print('ERROR - Destination Excel xls file format is not supported by openpyxl. Please, convert the file to an XLSX format')
status=1
return status
try:
wdestiny = openpyxl.load_workbook(path_Excel_Save)
except:
print('ERROR - Destination Excel file does not exist in the following location:\n {0}'.format(path_Excel_read))
status=1
return status
#we check if the destination sheet exists. If so, we will delete it
destination_list_sheets = wdestiny.get_sheet_names()
if((Sheet_new_name in destination_list_sheets) ==True):
print('WARNING - Sheet "{0}" exists in: {1}. It will be deleted!'.format(Sheet_new_name,path_Excel_Save))
wdestiny.remove_sheet(Sheet_new_name)
else:
wdestiny=openpyxl.Workbook()
# We copy the Excel sheet
try:
sheet_to_copy = wb.get_sheet_by_name(Sheet_name_to_copy)
target = wdestiny.copy_worksheet(sheet_to_copy)
target.title=Sheet_new_name
except:
print('ERROR - Could not copy the Excel sheet. Check the file')
status=1
return status
try:
wdestiny.save(path_Excel_Save)
except:
print('ERROR - Could not save the Excel sheet. Check the file permissions')
status=1
return status
#Program finishes
return status
助言がありますか?
乾杯
copy_worksheet()
を使用してブック間でコピーすることはできません。これは、ブック間で異なるグローバル定数に依存しているためです。続行するための安全で信頼できる唯一の方法は、行ごとおよびセルごとに進むことです。
この機能に関するディスカッション を読むことをお勧めします
この質問を見つけました。前述の here のような適切な回避策は、メモリ内の元のwb
を変更し、それを別の名前で保存することです。例えば:
import openpyxl
# your starting wb with 2 Sheets: Sheet1 and Sheet2
wb = openpyxl.load_workbook('old.xlsx')
sheets = wb.sheetnames # ['Sheet1', 'Sheet2']
for s in sheets:
if s != 'Sheet2':
sheet_name = wb.get_sheet_by_name(s)
wb.remove_sheet(sheet_name)
# your final wb with just Sheet1
wb.save('new.xlsx')
複数のワークブックから1つのワークブックにデータを照合するという同様の要件がありました。 openpyxlには組み込みのメソッドがないので。
次のスクリプトを作成して、この作業を行いました。
注:私のユースケースでは、すべてのワーブックに同じ形式のデータが含まれています。
from openpyxl import load_workbook
import os
# The below method is used to read data from an active worksheet and store it in memory.
def reader(file):
global path
abs_file = os.path.join(path, file)
wb_sheet = load_workbook(abs_file).active
rows = []
# min_row is set to 2, to ignore the first row which contains the headers
for row in wb_sheet.iter_rows(min_row=2):
row_data = []
for cell in row:
row_data.append(cell.value)
# custom column data I am adding, not needed for typical use cases
row_data.append(file[17:-6])
# Creating a list of lists, where each list contain a typical row's data
rows.append(row_data)
return rows
if __name__ == '__main__':
# Folder in which my source Excel sheets are present
path = r'C:\Users\tom\Desktop\Qt'
# To get the list of Excel files
files = os.listdir(path)
for file in files:
rows = reader(file)
# below mentioned file name should be already created
book = load_workbook('new.xlsx')
sheet = book.active
for row in rows:
sheet.append(row)
book.save('new.xlsx')
私が使用する回避策は、現在のシートをpandasデータフレームとして保存し、必要なExcelブックに読み込むことです。
私の回避策は次のようになります:
「template.xlsx」というテンプレートファイルがあるとします。それを開き、必要に応じて変更し、新しいファイルとして保存し、ファイルを閉じます。必要に応じて繰り返します。テスト/いじくり回している間は、必ず元のテンプレートのコピーを保管してください。