Копировать строки Excel из одной рабочей книги в другую - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь скопировать / вставить лист Excel (файл csv) в другой мастер-лист Excel.Этот мастер-лист уже содержит данные, и я хотел бы добавить к нему данные.

Однако код выполняется без сообщений об ошибках и не добавляет никаких данных на мастер-лист.

Код ниже:

#from openpyxl import Workbook
from openpyxl import load_workbook

#file to be copied
wb1 = load_workbook('inputDataTable.xlsx')
ws1 = wb1.get_sheet_by_name('testthis')

#file to be pasted into
wb2 = load_workbook('test.xlsx')
ws2 = wb2.get_sheet_by_name('testthis')

def copyRows():
#range counter for rows/cols
    rowCounter = 0
    for row in ws1.iter_rows():
        colCounter = 0
        for col in ws1.iter_cols():
            colCounter += 1
        rowCounter += 1   
#copy part
    rowList = [] #list of lists of rows
    for i in range(1, rowCounter+1):
        rowSelected = [] #list of rows
        for j in range(1, colCounter+1):
            rowSelected.append(ws1.cell(row=i, column=j).value) #cell values are added to the list of rows
        rowList.append(rowSelected)
    print(rowList)
    return rowList



def pasteRows(copiedData):
#range counter for rows/cols
    rowCounter = 0
    for row in ws2.iter_rows():
        colCounter = 0
        for col in ws2.iter_cols():
            colCounter += 1
        rowCounter += 1
#paste part
    countRow = 0
    for i in range(1, rowCounter+1):
        countCol = 0
        for j in range(1, colCounter+1):
            ws2.cell(row=i, column=j).value = copiedData[countRow][countCol]
            countCol += 1
        countRow += 1
    wb2.save('test.xlsx')
pasteRows(copyRows()) 

Точно так же, как это , но без жестких кодов.

1 Ответ

0 голосов
/ 26 марта 2019

Проблема с вашим кодом заключается в способе вычисления и использования счетчика

rowCounter просто означает строку в файле Excel Предположим, у вас есть два файла inp.xlsx 3 строки out.xlsx 2 строки

first you calculate __rowCounter__ as 3 in copyrows()
then you calculate again __rowCounter__  in pasterows() 
for file __out.xlsx__ and it becomes 2

так что вы хотите написать только 2 строки

если файл не существует или был пуст ваш цикл записывает 0 раз как rowCounter становится 0

попробуйте это для счетчика

wb = load_workbook(path, use_iterators=True)
sheet = wb.get_sheet_by_name(sheet_name)

rowCounter = sheet.max_row
colCounter = sheet.max_column

вот ваш ответ

from openpyxl import load_workbook

wb1 = load_workbook('input.xlsx')
ws1 = wb1.get_sheet_by_name('Sheet1')

row_counter = ws1.max_row
col_counter = ws1.max_column

#file to be pasted into
wb2 = load_workbook('output.xlsx')
ws2 = wb2.get_sheet_by_name('Sheet1')



def copyRows():
# we use global variable row_counter and col_counter directly into pasteRows()
#copy part
    rowList = [] #list of lists of rows
    for i in range(1, row_counter+1):
        rowSelected = [] #list of rows
        for j in range(1, col_counter+1):
            rowSelected.append(ws1.cell(row=i, column=j).value) #cell values are added to the list of rows
        rowList.append(rowSelected)
    print(rowList)
    return rowList



def pasteRows(data):
#paste part
    countRow = ws2.max_row  # in case ws2 contains rows already
    for Row in range(row_counter):
        for Col in range(col_counter):
            ws2.cell(row= Row+countRow + 1, column=Col+1).value = data[Row][Col]

    wb2.save('test.xlsx')
pasteRows(copyRows())


##  the following is the content of each xlsx files
##
##      input.xlsx
##    Name      Class     Marks
##    Roushan    7        90
##    James      8        78
##    Johny      9         95
##
##      output.xlsx
##    we     are   here
##
##     test.xlsx empty
##
##     both input.xlsx and output.xlsx have cells in Sheet1
...