Excel e documentos de trabalho

Encontre linhas duplicadas no Excel e separe-as para revisão

Encontre linhas com correspondência exata nas quatro colunas e reúna-as em um novo arquivo do Excel junto com seus números de linha originais. Revise cada grupo de duplicatas, incluindo a primeira ocorrência.

Ver o sumário

A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. English

Para quem éProfissionais de escritório que verificam entradas duplicadas após combinar dados do Excel

Preparação
  • Tenha Python 3.12 e um terminal prontos. Verifique a versão com python --version.
  • Extraia todo o ZIP baixado e abra um terminal na pasta que contém example.py.
  • Comece com os dados de prática incluídos e depois compare os resultados com os arquivos originais.
  • Este exemplo usa a planilha Orders em orders.xlsx e openpyxl. O aplicativo Microsoft Excel não é necessário para executar o código.

01Defina o que conta como duplicata

Neste exemplo, as linhas são duplicatas somente quando os quatro valores correspondem: order_id, customer, item e quantity. Apenas números de pedido iguais não tornam as linhas duplicadas. Espaços e diferenças entre maiúsculas e minúsculas em strings não são alterados automaticamente.

Antes de excluir qualquer coisa, reúna na planilha Duplicates todas as linhas com conteúdo correspondente, incluindo a primeira ocorrência. As linhas que aparecem apenas uma vez vão para a planilha Unique, para que você possa revisar todas as 8 linhas de entrada sem omissões.

02Inspecione a estrutura do arquivo de entrada

A planilha em orders.xlsx deve se chamar Orders, e sua primeira linha deve ter os nomes das colunas e a ordem mostrados abaixo. Adicionar colunas também causa erro de cabeçalho. Em vez de substituir imediatamente o exemplo por um arquivo de trabalho real, crie primeiro um arquivo de prática copiando apenas as quatro colunas obrigatórias.

ColunaFinalidadeExemplo
order_idNúmero do pedido como textoO-1001
customerNome do cliente como textoAlpha
itemItem como textoSensor
quantityQuantidade como inteiro positivo2

Linhas completamente vazias são ignoradas. O script para se apenas alguns valores estiverem ausentes ou se uma linha contiver uma fórmula. Números de pedido, nomes de cliente e itens devem ser strings não vazias. Números de pedido numéricos não são convertidos automaticamente; prepare-os como texto no arquivo de entrada.

03Prepare os arquivos e execute o exemplo

  1. Extraia o ZIP e verifique se o arquivo de entrada listado em README.txt está na mesma pasta que example.py. Não execute o exemplo de dentro do arquivo ZIP.
  2. Execute os comandos abaixo, uma linha por vez, na pasta que contém example.py. No Windows, se python não estiver disponível mas py estiver, substitua python em cada comando por py -3.12.
  3. Depois que a mensagem de conclusão aparecer, abra a nova pasta outputs. Se outputs já existir, renomeie-a primeiro para preservar os resultados anteriores e então execute o exemplo novamente.
bash
python --version
python -m pip install -r requirements.txt
python example.py

A instalação requer conexão com a internet. BASE no código define os caminhos de entrada e saída em relação a example.py, e não à pasta atual do terminal.

04Código completo e ordem de processamento

O código abre o original com load_workbook em modo somente leitura e usa Counter para contar quantas vezes cada linha ocorre. Ele acompanha os números originais das linhas do Excel com enumerate e start=2. Os resultados são salvos em um novo Workbook, portanto o original não é salvo novamente.

example.py
"""Find repeated business rows. Keep the source workbook unchanged."""
from collections import Counter
from pathlib import Path

from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, PatternFill

BASE = Path(__file__).resolve().parent
HEADERS = ("order_id", "customer", "item", "quantity")


def main():
    destination = BASE / "outputs"
    if destination.exists():
        raise ValueError("outputs already exists; rename it before running again.")
    source = load_workbook(BASE / "orders.xlsx", read_only=True, data_only=False)
    try:
        if "Orders" not in source.sheetnames:
            raise ValueError("Orders sheet is missing.")
        worksheet = source["Orders"]
        rows = list(worksheet.iter_rows(values_only=True))
        if not rows or tuple(rows[0]) != HEADERS:
            raise ValueError(f"Expected headers: {HEADERS}")
        records = []
        for row_number, row in enumerate(rows[1:], start=2):
            if all(value is None for value in row):
                continue
            if any(value is None for value in row):
                raise ValueError(f"Row {row_number}: missing value.")
            if any(isinstance(value, str) and value.startswith("=") for value in row):
                raise ValueError(f"Row {row_number}: formulas are not supported.")
            if not all(isinstance(value, str) and value.strip() for value in row[:3]):
                raise ValueError(f"Row {row_number}: first three fields must be text.")
            if type(row[3]) is not int or row[3] <= 0:
                raise ValueError(f"Row {row_number}: quantity must be a positive integer.")
            records.append((row_number, tuple(row)))
        if not records:
            raise ValueError("No data rows were found.")
    finally:
        source.close()

    counts = Counter(row for _, row in records)
    repeated = [(number, row) for number, row in records if counts[row] > 1]
    unique = [(number, row) for number, row in records if counts[row] == 1]
    book = Workbook()
    book.remove(book.active)
    for name, selected in (("Duplicates", repeated), ("Unique", unique)):
        sheet = book.create_sheet(name)
        sheet.append(("source_row", *HEADERS, "occurrences"))
        for number, row in selected:
            sheet.append((number, *row, counts[row]))
        sheet.freeze_panes = "A2"
        sheet.auto_filter.ref = sheet.dimensions
        sheet.sheet_view.showGridLines = False
        for cell in sheet[1]:
            cell.font = Font(name="Arial", bold=True, color="FFFFFF")
            cell.fill = PatternFill("solid", fgColor="243B53")
        for column, width in zip("ABCDEF", (14, 16, 18, 20, 14, 16)):
            sheet.column_dimensions[column].width = width
    destination.mkdir(exist_ok=False)
    book.save(destination / "duplicate_review.xlsx")
    book.close()
    groups = sum(count > 1 for count in counts.values())
    print(f"Input rows: {len(records)}; duplicate groups: {groups}")
    print(f"Duplicate rows: {len(repeated)}; unique rows: {len(unique)}")
    print("Created outputs/duplicate_review.xlsx (source unchanged).")


if __name__ == "__main__":
    try:
        main()
    except (OSError, ValueError) as error:
        raise SystemExit(f"Stopped: {error}") from error

05Resultados criados pelo script

O script cria duas planilhas, Duplicates e Unique, em outputs/duplicate_review.xlsx. source_row é o número da linha no Excel original e occurrences é o número de vezes que o mesmo conteúdo aparece em toda a entrada.

ItemResultado para os dados incluídos
Linhas de dados de entrada8
Grupos de duplicatas2
Linhas em Duplicates4 (linhas originais 2, 3, 5, 8)
Linhas em Unique4 (linhas originais 4, 6, 7, 9)

As 4 linhas em Duplicates não significam que 4 linhas devem ser removidas. Se você mantiver uma linha de cada grupo, haverá 2 entradas extras. Decida qual manter somente depois de verificar os originais.

06Verifique os resultados por conta própria

  1. Em Duplicates, verifique se source_row 2 e 5 têm ambos O-1001 e occurrences igual a 2.
  2. Verifique se source_row 3 e 8 têm ambos O-1002.
  3. Some as 4 linhas de Duplicates e as 4 linhas de Unique e confirme que correspondem às 8 linhas de entrada.
  4. Reabra orders.xlsx e verifique se todas as 8 linhas de dados permanecem inalteradas.

07Erros comuns e como corrigi-los

Mensagem ou sintomaO que verificar
Orders sheet is missingDefina o nome da planilha original como Orders.
Expected headersVerifique os nomes das colunas, sua ordem e quaisquer colunas extras.
missing value / formulas are not supportedVerifique a linha original informada e forneça valores em vez de fórmulas.
quantity must be a positive integerInforme uma quantidade que seja um inteiro igual ou maior que 1.
outputs already existsRenomeie a pasta de resultados anterior para preservá-la.
ModuleNotFoundErrorInstale os pacotes em requirements.txt usando o mesmo python que você usa para executar o exemplo.

08O que este exemplo não cobre

  • Ele não copia formatação, gráficos, macros, conexões nem estados de linhas ocultas. O resultado contém apenas os valores necessários para revisão e formatação básica.
  • Ele não remove espaços, não padroniza maiúsculas e minúsculas nem detecta strings semelhantes. Se a sua definição de duplicata mudar, crie critérios de comparação separados.
  • Ele mantém todo o arquivo na memória, portanto não garante desempenho em arquivos grandes. Arquivos criptografados ou danificados não são suportados.
  • Editar valores no arquivo de resultado não recalcula automaticamente o original nem os resultados. Para obter novos resultados, edite uma cópia do original e execute o script novamente.

Registro de execução e verificação

Windows 11 (10.0.26200), CPython 3.12.14 (64-bit). openpyxl 3.1.5, Matplotlib 3.10.8. As bibliotecas usadas por cada exemplo estão fixadas em requirements.txt.

  • Foram verificados os totais de linhas, os números originais das linhas e as contagens de ocorrências para dados válidos
  • Foi confirmado que o hash SHA-256 do arquivo original permaneceu inalterado e que a sobrescrita foi rejeitada em uma execução repetida
  • Foram verificados erros para cabeçalhos incompatíveis, valores ausentes, fórmulas e quantidades inválidas
Limites da verificação
  • A exibição no aplicativo de desktop do Excel e o desempenho em arquivos grandes não foram verificados.

Princípios de redação e verificação de todo o site

Arquivos de exemplo para executar

Inclui código, dados de entrada e instruções de execução. Extraia o ZIP e leia primeiro o README.txt.

Baixar ZIP de exemplo

O código de exemplo, os nomes de arquivos e as chaves de entrada são mantidos como no original. Consulte também os comandos e os procedimentos de conferência do texto traduzido.

Material de prática original · Guarde os arquivos originais separadamente antes de executar.

Fontes de referência

As explicações e os exemplos são de elaboração própria. Os comportamentos e conceitos relacionados podem ser consultados nas fontes oficiais abaixo.