将Excel行从一个工作簿复制到另一工作簿

时间:2019-03-26 12:57:12

标签: python excel anaconda spyder openpyxl

我正在尝试将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()) 

就像this,但没有硬编码范围。

1 个答案:

答案 0 :(得分:0)

代码的问题是计算和使用计数器的方式

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行

如果文件不存在或为空 当 rowCounter 变为0

时,循环将写入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