Transforme registros de trabalho em uma tabela e gráfico de resumo mensal
Valide as datas e horas de trabalho em um CSV e depois salve as contagens mensais de registros e o total de horas como um CSV e um gráfico de barras.
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.
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
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.
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.
| Coluna | Finalidade | Exemplo |
|---|---|---|
| order_id | Número do pedido como texto | O-1001 |
| customer | Nome do cliente como texto | Alpha |
| item | Item como texto | Sensor |
| quantity | Quantidade como inteiro positivo | 2 |
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.
python --version
python -m pip install -r requirements.txt
python example.pyA 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.
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.
"""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
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.
| Item | Resultado para os dados incluídos |
|---|---|
| Linhas de dados de entrada | 8 |
| Grupos de duplicatas | 2 |
| Linhas em Duplicates | 4 (linhas originais 2, 3, 5, 8) |
| Linhas em Unique | 4 (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.
| Mensagem ou sintoma | O que verificar |
|---|---|
| Orders sheet is missing | Defina o nome da planilha original como Orders. |
| Expected headers | Verifique os nomes das colunas, sua ordem e quaisquer colunas extras. |
| missing value / formulas are not supported | Verifique a linha original informada e forneça valores em vez de fórmulas. |
| quantity must be a positive integer | Informe uma quantidade que seja um inteiro igual ou maior que 1. |
| outputs already exists | Renomeie a pasta de resultados anterior para preservá-la. |
| ModuleNotFoundError | Instale os pacotes em requirements.txt usando o mesmo python que você usa para executar o exemplo. |
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.
Inclui código, dados de entrada e instruções de execução. Extraia o ZIP e leia primeiro o README.txt.
Baixar ZIP de exemploO 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.
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.