【问题标题】:Python Openpyxl Copy Data From Rows Based on Cell Value& Paste In Specific Rows of ExcelSheetPython Openpyxl 根据单元格值粘贴到 Excel 工作表的特定行中从行中复制数据
【发布时间】:2022-11-20 09:03:09
【问题描述】:

我正在尝试根据一张纸上的 Column ['A'] 单元格值按行复制数据,然后粘贴到另一张纸的 row2 中。工作表中的粘贴是现有工作表,工作表的第 1 行是我的标题行,所以我想从第 2 行开始粘贴复制的数据。我不想追加,因为我在工作表中的粘贴中有现有的公式列将被覆盖,而且追加我会丢失格式。所以说我的工作表副本的 A 列是 States,我想复制 Column ['A'] cell.value 是 'Georgia' 的所有行并粘贴到 sheet2 的 row2,复制 Column ['A'] 单元格所在的行。 value = Texas 并粘贴到工作表 3 的第 2 行等(将每个州粘贴到不同的工作表中)。我能够复制数据并粘贴,但我无法将其粘贴到第 2 行中,它正在粘贴数据在我的工作表副本中的任何行中。因此,如果 Texas 从第 3000 行开始,我的代码将从工作表副本的第 3000 行复制并粘贴到工作表 2 的第 3000 行,这意味着我的工作表 2 的第 1-2999 行都是空行, 从文件复制如下:

粘贴到文件中如下所示: 请参阅下面的代码

import openpyxl
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.utils import range_boundaries
from sys import argv
script, inpath, outpath = argv


# load copy from file
wb_cpy = load_workbook(r'C:\Users\me\documents\sourcefolder\copyfromfile.xlsx')
ws = wb_src["sheet1"]

# load paste in file
wb_pst = load_workbook(r'C:\Users\me\documents\sourcefolder\pasteinfile.xlsx')
ws2 = wb_dst["sheet2"]


for row in ws.iter_rows(min_col=1, max_col=1, min_row=9):
   for row2 in ws2.iter_rows(min_col=1, max_col=1, min_row=2):
       for cell in row:
           for cell2 in row2:
            if cell.value == "GEORGIA":
                ws2.cell(row=cell.row, column=1).value = ws.cell(row=cell.row, column=1).value 
                ws2.cell(row=cell.row, column=2).value = ws.cell(row=cell.row, column=2).value
                ws2.cell(row=cell.row, column=6).value = ws.cell(row=cell.row, column=6).value
              
        
wb_pst.save(r'C:\Users\me\documents\sourcefolder\pasteinfile.xlsx')
#ps: i will repeat the script for each state

我可能完全错了,但我尝试了多种其他方法但没有成功,我无法将复制的数据粘贴到工作表中粘贴的第 2 行

【问题讨论】:

  • 根据你的解释,我猜 image2 是“pasteinfile.xlsx”,它由许多重复的工作表组成,你想从示例数据中复制每个州的数据,(我假设的 image1 是“copyfromfile.xlsx”)到连续工作表中的“pasteinfile.xlsx”。即对于您的示例数据: 格鲁吉亚范围是 A2:F7在“copyfromfile.xlsx”中,因此此范围将被复制到“pasteinfile.xlsx”第一张纸上的 A2:F7。阿拉巴马州范围 A8:F12, 将被复制到第二张纸上的 A2:F6 范围,而 *TEXAS 范围 A13:F21, 将被复制到第三张纸上的 A2:F10 范围内。

标签: python openpyxl


【解决方案1】:

您的代码中似乎存在一些不一致,例如

wb_cpy = load_workbook(r'C:Usersmedocumentssourcefoldercopyfromfile.xlsx')
ws = wb_src["sheet1"]

ws 引用的工作簿对象与刚创建的对象不同,或者实际上在您的代码中似乎不存在。与下一个工作簿和工作表对象类似 编写代码时应尽量避免重复,因此尽可能重用代码。

下面是一些示例代码,它基于我评论中的假设,并且状态按照您的示例数据中所示的顺序排列,即没有混在一起,并且状态列表的顺序相同。

该代码使用状态的 python 列表进行搜索,然后将连续的行复制到当前的“pasteinfile.xlsx”工作表,直到下一个状态数据。然后,它将该状态数据复制到下一个“pasteinfile.xlsx”工作表,依此类推。
概括
状态列表是在此处手动添加的,但是如果这些每次都发生变化,则可以从 A 列中的值中获取之前的值。对列表中从 A2 开始的每个州在 A 列上进行搜索,然后从最后复制的州数据的最后一行开始搜索,即在复制 GEORGIA 行之后,下一个搜索是 ALABAMA,它将从第 7 行开始,即GEORGIA 行的末尾。
作为“状态”匹配,它将第一行设置为将“pasteinfile.xlsx”工作表中的数据粘贴到第 2 行,然后遍历第一个匹配行中的单元格并将每个单元格值复制到“pasteinfile.xlsx”(从第 2 行)。然后再次检查 A 列中的下一行是否存在状态匹配,如果为真,则将下一行复制到“pasteinfile.xlsx”的第 3 行,依此类推,直到状态不再匹配。此时它循环到下一个状态并将起始行重置回 2 并设置下一个数字工作表名称。然后重复相同的过程,直到搜索到列表中的所有州。
对于每个状态,“pasteinfile.xlsx”工作表名称递增 1,即“Sheet1”、“Sheet2”等。代码从“Sheet1”开始命名,但是如果需要可以更改为从另一个数字开始。

...
# load copy from file
wb_cpy = load_workbook('copyfromfile.xlsx')
# ws = wb_src["sheet1"]
ws = wb_cpy["Sheet1"]

# load paste in file
wb_pst = load_workbook('pasteinfile.xlsx')
# ws2 = wb_dst["sheet2"]

copyfrom_max_columns = ws.max_column

paste_start_min_row = 1
states_list = ['GEORGIA', 'ALABAMA', 'TEXAS']  # States list to search
for sheet_number, state in enumerate(states_list, 1):
    ws2 = wb_pst["Sheet" + str(sheet_number)]  # Set Sheet name for current pasted data
    search_min_row = paste_start_min_row  # Start search for States at top row then from the end of the last searched State
    paste_start_min_row = 1  # Reset the row number for each new sheet so the copy starts at row 2
    for row in ws.iter_rows(max_col=1, min_row=search_min_row):  # min_col defaults to 1
        for cell in row:
            if cell.value == state:  # Search ColA for the State, when match is found proceed to copy/paste
                paste_start_min_row += 1  # Set first row for 'copy to' to 2
                for i in range(copyfrom_max_columns):  # Iterate the cells in the row to max column
                    # Grab value from each cell in the row using offset from Col A and
                    # Paste the copied value to the 'pasteinfile.xlsx' Sheet
                    ws2.cell(row=paste_start_min_row, column=i+1).value = cell.offset(column=i).value

wb_pst.save('pasteinfile.xlsx')

此图像是运行代码前后“pasteinfile.xlsx”(本例中为 Sheet2)中 ALABAMA 工作表的示例。笔记我将 Type 列中的每一行设置为一个数值,作为每一行数据的唯一标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多