Criar uma tabela e um gráfico mensais a partir de registros de trabalho
Valide as datas e as horas de trabalho do CSV e salve a quantidade de registros e o total de horas de cada mês em um CSV e um gráfico de barras.
Busque linhas com as quatro colunas idênticas e reúna-as em um novo arquivo do Excel com os números das linhas originais. Confira cada grupo de duplicatas incluindo sua 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. 한국어
Para quem éProfissionais administrativos que conferem entradas duplicadas após reunir dados do Excel
Neste exemplo, uma linha é duplicada quando os quatro valores coincidem: order_id, customer, item e quantity. Ter apenas o mesmo número de pedido não basta. Também não são alterados automaticamente os espaços nem as maiúsculas e minúsculas das strings.
Antes de remover duplicatas, todas as linhas com o mesmo conteúdo são reunidas na planilha Duplicates, incluindo a primeira ocorrência. As linhas que aparecem uma única vez ficam em Unique, permitindo revisar as 8 linhas sem omissões.
A planilha de orders.xlsx deve se chamar Orders, e os nomes e a ordem das colunas na primeira linha devem corresponder aos indicados abaixo. Adicionar colunas também causa um erro de cabeçalho. Em vez de substituir diretamente o exemplo por um arquivo de trabalho, crie um arquivo de prática copiando as quatro colunas necessárias.
| Coluna | Função | Exemplo |
|---|---|---|
| order_id | Número do pedido como string | O-1001 |
| customer | Nome do cliente como string | Alpha |
| item | Item como string | Sensor |
| quantity | Quantidade como inteiro positivo | 2 |
Linhas totalmente vazias são ignoradas. Se faltar algum valor ou houver uma fórmula, o programa para. O número do pedido, o nome do cliente e o item devem ser strings não vazias; números de pedido inseridos como valores numéricos não são convertidos automaticamente em texto.
python --version
python -m pip install -r requirements.txt
python example.pyA instalação exige conexão com a internet. BASE define os caminhos de entrada e saída a partir da localização de example.py, não da localização atual do terminal.
O original é aberto no modo somente leitura com load_workbook, e Counter conta as ocorrências de cada linha. Os números das linhas do Excel original são registrados com enumerate usando start=2. Os resultados são salvos em um novo Workbook, portanto o arquivo 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
São criadas as planilhas Duplicates e Unique em outputs/duplicate_review.xlsx. source_row é o número da linha do Excel original, e occurrences indica quantas vezes o mesmo conteúdo aparece em toda a entrada.
| Item | Resultado com os dados incluídos |
|---|---|
| Linhas de dados de entrada | 8 |
| Grupos de duplicatas | 2 |
| Linhas de Duplicates | 4 (linhas originais 2, 3, 5, 8) |
| Linhas de Unique | 4 (linhas originais 4, 6, 7, 9) |
As 4 linhas de Duplicates não significam que 4 linhas devam ser removidas. Se uma linha for mantida por grupo, há 2 linhas adicionais, mas é necessário conferir o original antes de decidir quais manter.
| Mensagem ou sintoma | O que conferir |
|---|---|
| Orders sheet is missing | Confira se a planilha original se chama Orders. |
| Expected headers | Confira os nomes, a ordem e as colunas extras. |
| missing value / formulas are not supported | Confira a linha original indicada e prepare valores em vez de fórmulas. |
| quantity must be a positive integer | Informe a quantidade como um inteiro de 1 ou mais. |
| outputs already exists | Guarde a pasta de resultados anterior com outro nome. |
| ModuleNotFoundError | Instale os pacotes de requirements.txt usando o mesmo python com que você executa o código. |
Windows 11 (10.0.26200), CPython 3.12.14 (64 bits). openpyxl 3.1.5, Matplotlib 3.10.8. As versões das bibliotecas usadas em 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.