Dagrapport per e-mailOntwikkeling & maatwerk

Een Python-script dat een kort rapport maakt van je Excel-bestanden en het vanuit je eigen mailbox mailt

Meestal klaar in 15 minutenRevisies inbegrepenKwaliteitscontrole
Pakketten
BetaalbeschermingDetails
  • Revisies binnen het pakket zijn gratis.
  • Reageer je niet binnen 3 dagen na levering, dan wordt het werk automatisch goedgekeurd.

Het geld wordt bij betaling gereserveerd en pas vrijgegeven als je het werk goedkeurt.

Een Python-script dat een kort rapport maakt van je Excel-bestanden en het vanuit je eigen mailbox mailt

Voorbeeldresultaat

Voorbeeld voor het pakket Standaard

Merging the monthly sales files of 9 shops into one Excel report

How it is run

python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO  Folder: sales/2026-10, 9 files found
2026-11-02 09:14:03 INFO  shop-01.csv: 1,284 rows
2026-11-02 09:14:04 INFO  shop-02.xlsx: 967 rows
2026-11-02 09:14:04 WARN  shop-07.csv: 3 rows without a price skipped (lines 88, 412, 913)
2026-11-02 09:14:05 INFO  Done: 10,412 rows -> report-2026-10.xlsx (sheets "Sales" and "Totals")

Settings, not code

The column names of each shop live in settings.ini, so a new shop or a renamed column is a line there:

[columns]
date = Date, Sale date, Day
product = Product, Item, Name
quantity = Qty, Quantity, Pcs
price = Price, Unit price

A part of the code

def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
    """Reads one shop's file and gives it the report's column names."""
    table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
    renamed = {}
    for name, variants in columns.items():
        found = next((c for c in table.columns if c.strip() in variants), None)
        if found is None:
            raise ReportError(f"{path.name}: no column for '{name}' (looked for {', '.join(variants)})")
        renamed[found] = name
    table = table.rename(columns=renamed)[list(columns)]
    table["shop"] = path.stem
    return table

Files: a ZIP archive with merge_sales.py (310 lines), settings.ini, requirements.txt and a README with installing Python, running the script and what each message in the log means. The client runs it on their own computer.

Client: a small chain of 9 stationery shops; each shop sends its sales for the month as a CSV or Excel file, with slightly different column names. Task: one script that reads every file in a folder, brings the columns to one shape, and writes a single Excel report with all sales and a sheet of totals by shop.

De klant en alle details zijn verzonnen.

Over deze dienst

Opent iemand op kantoor elke ochtend hetzelfde Excel-bestand, kopieert hij de totalen en zet hij ze in een e-mail, dan kan dit Python-script dat deel overnemen. Het leest de bestanden die je noemt, zoals de verkoopexport van gisteren of een voorraadbestand in een gedeelde map, berekent wat je vraagt (totalen, aantallen, gemiddelden per winkel of product, de rijen boven een grens) en stuurt vanuit je eigen mailaccount een korte e-mail met een nette tabel naar de mensen die je opgeeft, vanaf Standaard met het bestand als bijlage. Het verzendwachtwoord van het mailaccount zet je zelf in de instellingen; het komt nooit in de code. De ontvangers zijn je eigen collega's of klanten, ruim binnen de verzendlimieten van je maildienst. Het rapporteert de cijfers in je bestanden; het controleert of verklaart ze niet.

Wat is inbegrepen

  • Wat je krijgtEen ZIP-archief met het Python-script, een README met stapsgewijze instructies en, vanaf Standaard, een instellingenbestand met bestanden, ontvangers en mailinstellingen; de code staat ook op de bestelpagina.
  • Jouw cijfersTotalen, aantallen en gemiddelden die jij kiest
  • Een leesbare e-mailEen korte tabel die ook op een telefoon opent
  • Vanuit je mailboxJe eigen mailaccount, wachtwoord buiten de code
  • Bestand als bijlageVanaf Standaard het Excel-bestand of een samenvatting ervan
  • Leesbare codeMet commentaar, later makkelijk een cijfer toe te voegen

Hoe het werkt

  1. 1
    TaakJe stuurt een voorbeeldbestand en een voorbeeld van de e-mail die je wilt
  2. 2
    CodeWij schrijven het script en de handleiding om het uit te voeren
  3. 3
    UitproberenJe voert het uit met alleen je eigen adres op de lijst
  4. 4
    WijzigingenJe vraagt binnen je pakket om wijzigingen en stuurt een eventuele foutmelding mee

Wat we van je nodig hebben

Een van de Excel-bestanden waaruit het rapport wordt gemaakt, ingekort tot een paar rijen of met gewijzigde cijfers, waar de bestanden verschijnen (een map, een gedeelde schijf) en hoe ze heten, wat de e-mail moet tonen (schrijf hem uit zoals je hem met de hand zou maken), wie hem krijgt en vanuit welk mailaccount (de naam van de maildienst is genoeg; het wachtwoord vul je zelf in). Wanneer hij verstuurd moet worden, en de computer waarop het gaat draaien: Windows, macOS of Linux.

We vragen je:

  • Van welke bestanden wordt het rapport gemaakt?
  • Wat moet de e-mail tonen?
  • Wie krijgt hem, en wanneer?
  • Waar gaat het draaien?

Pakketten vergelijken

PakkettenBasisEén rapport€ 15StandaardRapport met instellingen€ 30PremiumRapporttool€ 60
Levertijd1 dag2 dagen3 dagen
Revisies123
Codetot 150 regelstot 400 regelstot 1.000 regels
Codebestanden1tot 3tot 8
InstellingenbestandNeeJaJa
Duidelijke foutmeldingen en een logNeeJaJa
Startopties en een handleiding om het volgens een schema te laten draaienNeeNeeJa
Handleiding voor installeren en uitvoeren (README)JaJaJa
TaalPythonPythonPython
Bestellen BasisBestellen StandaardBestellen Premium

Betaalbescherming

Je betaalt bij het bestellen, maar het geld wordt alleen vrijgegeven voor goedgekeurd werk.

  • Vaste prijsDe prijs van het pakket verandert niet meer nadat je hebt betaald.
  • Het geld wordt gereserveerdBij betaling wordt het bedrag alleen gereserveerd. Het gaat pas naar de dienst als je het werk goedkeurt.
  • Gecontroleerd vóór leveringElk resultaat doorloopt een kwaliteitscontrole voordat het bij jou komt, en je ziet het op de bestelpagina voordat je het goedkeurt.
  • Gratis revisiesVraag wijzigingen binnen je briefing aan, zo vaak als het pakket toestaat.
  • Goedkeuring na 3 dagenKeur je het werk binnen 3 dagen na levering niet goed en vraag je ook geen wijzigingen, dan wordt het automatisch goedgekeurd. Schrijf je na levering in de chat van de bestelling, dan wacht de bestelling; zodra we hebben geantwoord, kunnen we de 3 dagen opnieuw laten ingaan en melden we dat in de chat.
  • Opnieuw doen of volledige terugbetalingPast het resultaat niet bij je briefing en hebben de revisies dat niet opgelost, of duurt het werk meer dan twee keer zo lang als de levertijd, schrijf dan in de chat van de bestelling: we doen het werk opnieuw of betalen het volledige bedrag terug.
Hoe het werkt →

Vragen en antwoorden

Verstuurt het het rapport elke dag vanzelf?

Het verstuurt een rapport elke keer dat het draait. Premium bevat een handleiding om het elke ochtend te laten draaien met Taakplanner, cron of launchd; met Basis of Standaard voer je het zelf uit of stel je dat zelf in. De computer moet op dat moment aanstaan.

Met welke mailaccounts werkt het?

Met de meeste diensten die verzenden via SMTP toestaan, en daar horen gangbare zakelijke en persoonlijke mailaccounts bij. Sommige vragen je hiervoor een app-wachtwoord aan te maken; de README laat zien waar.

Mijn bestanden staan in Google Spreadsheets, niet in Excel. Werkt dat?

Daarvoor past een Google Apps Script in de spreadsheet beter, dat vanuit je Gmail verstuurt; zeg het in de briefing, dan schrijven we het in Apps Script.

Kan het het rapport naar mijn klanten sturen?

Ja, naar mensen die het verwachten, zoals klanten die om een dagelijkse voorraadlijst hebben gevraagd. Het is niet bedoeld voor massamailings of voor lijsten die je niet zelf hebt verzameld.

Staat je antwoord er niet bij?

Pakketten