web-dev-qa-db-ja.com

Openpyxlを使用してワークシートを1つのワークブックから別のワークブックにコピーする

大量の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    

助言がありますか?

乾杯

7
idillus

copy_worksheet()を使用してブック間でコピーすることはできません。これは、ブック間で異なるグローバル定数に依存しているためです。続行するための安全で信頼できる唯一の方法は、行ごとおよびセルごとに進むことです。

この機能に関するディスカッション を読むことをお勧めします

3
Charlie Clark

この質問を見つけました。前述の 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
floatingpurr

複数のワークブックから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')
1
Bandi Sandeep

私が使用する回避策は、現在のシートをpandasデータフレームとして保存し、必要なExcelブックに読み込むことです。

0
IDontKnowCode

私の回避策は次のようになります:

「template.xlsx」というテンプレートファイルがあるとします。それを開き、必要に応じて変更し、新しいファイルとして保存し、ファイルを閉じます。必要に応じて繰り返します。テスト/いじくり回している間は、必ず元のテンプレートのコピーを保管してください。

0
NamasteJasutin