【问题标题】:Python3 openpyxl Copying data from row that contains certain value to new sheet in existing workbookPython3 openpyxl将包含特定值的行中的数据复制到现有工作簿中的新工作表
【发布时间】:2017-12-22 03:33:41
【问题描述】:

我正在尝试将具有特定值的行复制到新工作表中。在查看下面列出的参考资料时,我能够确定如何使用 ws.append 进行复制,但是这在脚本中无法正常运行。我想做的是遍历 wb,如果它有一定的值,创建另一个工作表并将该行复制到该工作表。我将不胜感激这方面的任何帮助,因为我没有产生预期的结果。我唯一要做的就是添加一些 elif 条件以及 else ,但它没有遍历工作表并复制预期的结果。它正在复制其中一行而不是每个条件的预期行,并将其复制到与 ws 同名的新文件,而不是在条件中创建的新工作表。

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

min_col, min_row, max_col, max_row = range_boundaries("A:M")
wb = load_workbook(inpath)
print("File Loaded")
ws = wb.get_sheet_by_name("value")

check = 0 # == A

for row in ws.iter_rows():
    if row[check].value == 'value':
        try:
            ws1 = wb.create_sheet("value", 1)
        # Copy Row Values
        # We deal with Tuple Index 0 Based, so min_col must have to be -1
            ws1.append((cell.value for cell in row[min_col-1:max_col]))
        except:
            print("words")
    elif row[check].value == 'value':
        try:
            ws2 = wb.create_sheet("value", 2)
        # Copy Row Values
        # We deal with Tuple Index 0 Based, so min_col must have to be -1
            ws2.append((cell.value for cell in row[min_col-1:max_col]))
        except:
            print("moar words")

    elif row[check].value == 'value':
        try:
            ws3 = wb.create_sheet("value", 3)
        # Copy Row Values
        # We deal with Tuple Index 0 Based, so min_col must have to be -1
            ws3.append((cell.value for cell in row[min_col-1:max_col]))
        except:
            print("words")
    else:
        try:
            ws4 = wb.create_sheet("value", 4)
        # Copy Row Values
        # We deal with Tuple Index 0 Based, so min_col must have to be -1
            ws4.append((cell.value for cell in row[min_col-1:max_col]))
        except:
            print("words")


wb.save(outpath + '.xlsx')

如果我运行以下命令

for row in ws.iter_rows():
    if row[check].value == 'Info':

    try:
        #ws1.cell(row=1, column=1).value = ws1.cell(row=1, column=1).value
        ws1 = wb.create_sheet("Info", 1)
        ws1 = wb.active
    # Copy Row Values
    # We deal with Tuple Index 0 Based, so min_col must have to be -1
        ws1.append((cell.value for cell in row[min_col-1:max_col]))
    except:
        print("Words")



wb.save(outpath + '.xlsx')

它运行我需要的查询,在这种情况下,每一行都包含单词 Info,但它不会创建新工作表,也不会将值附加到新工作表。它保持与原始工作表名称相同的工作表名称。添加 elif 或 else 语句无法正常工作。当这一切一起运行时。它只是在原始 excel 文件中创建大量带有标题 Info 和行号的工作表。我已将 if 语句中的值更改为 info 以外的值,它仍然输出包含 Info 的行。

参考:Openpyxl: How to copy a row after checking if a cell contains specific value

【问题讨论】:

标签: python-3.x openpyxl


【解决方案1】:

因此,通过与同事的讨论,我发现问题是在 for 循环中创建工作表,为每个具有指定值的单元格创建了一个工作表。以下内容已经过测试并且可以完美运行。

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

min_col, min_row, max_col, max_row = range_boundaries("A:M")
wb = load_workbook(inpath)
print("File Loaded")
ws = wb.get_sheet_by_name("Report")

interested_column = 6 # == G

ws1 = wb.create_sheet("Value", 1)
ws2 = wb.create_sheet("Value", 2)
ws3 = wb.create_sheet("Value", 3)
ws4 = wb.create_sheet("Value", 4)

for row in ws.iter_rows():
    if row[interested_column].value == 'Value':
        # Copy Row Values
        # We deal with Tuple Index 0 Based, so min_col must have to be -1
        ws1.append((cell.value for cell in row[min_col-1:max_col]))
    elif row[interested_column].value == 'Value':
        # Copy Row Values
        # We deal with Tuple Index 0 Based, so min_col must have to be -1
        ws2.append((cell.value for cell in row[min_col-1:max_col]))
    elif row[interested_column].value == 'Value':
        # Copy Row Values
        # We deal with Tuple Index 0 Based, so min_col must have to be -1
        ws3.append((cell.value for cell in row[min_col-1:max_col]))
    else:
        # Copy Row Values
        # We deal with Tuple Index 0 Based, so min_col must have to be -1
        ws4.append((cell.value for cell in row[min_col-1:max_col]))

wb.save(outpath + '.xlsx')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多