SheetHorse is wat CSVHorse is in zijn full variant: dezelfde gratis, server-vrije browser-werkbank, maar uitgebreid met multi-tabel ondersteuning, Excel-roundtrip met native cell-styles, een relaties-tabblad voor foreign-keys, SQL-joins over al je sheets, en een multi-tabel CSV-format waarin tabellen, relaties én query-output allemaal in één bestand passen via metadata-markers.
Open SheetHorse direct: cpaglebbeek.github.io/CSVHorse/sheethorse.
Het idee
Bij iCt Horse helpen we organisaties data-werk pragmatisch maken. Een terugkerend patroon: mensen hebben relationele data — klanten, orders, producten — maar geen DBMS, geen tijd om Power BI in te richten, en geen wens om hun data naar een SaaS te uploaden. Tegelijk willen ze: opmaak behouden, queries kunnen draaien, en de hele zaak als één bestand kunnen doorgeven.
SheetHorse pakt die niche: een browser-native CSV/Excel-werkbank met een virtuele relationele laag erbovenop. Geen server, geen account, geen install. Alles in één HTML-bestand — je hele tool past op een USB-stick.
Features (live nu — v0.6.0.2-Hanoverian)
📁 CSV import & lege start
Alles wat CSVHorse heeft — drag-drop CSV, dialect-auto-detect, lege CSV starten via dialog — werkt onveranderd in SheetHorse.
📂 Excel (.xlsx) import
Sleep een .xlsx op de pagina → alle tabbladen worden geladen, met cell-opmaak gelift naar interne style-objecten. Ook eventuele __style_*-kolommen worden mee gelift (Excel-styles winnen bij conflict). Embedded objects (charts/images) worden gedetecteerd en gemeld — niet geïmporteerd.
💾 Excel-roundtrip met opmaak
Export naar .xlsx met native Excel cell-styles: bold/italic/underline/strikethrough/kleur/fill/fontSize/alignment per cel. Bidirectionele mapping — wat eruit gaat komt terug in. Vendor: xlsx-populate (MIT).
📋 Multi-sheet tab-strip
Tabblad-strip onderaan, Excel-stijl. Klikken = wisselen. Per-sheet state: undo-stack, filter, selectie en zoek-matches blijven per tabblad behouden. Sheet-naam bewerkbaar via dubbelklik. + Nieuw werkblad. × Verwijderen.
✏ Header- & cell-edit
Dubbelklik op een kolom-header = bewerk de naam (incl. uniek-check). Cell-edit zoals in CSVHorse, met onbeperkte undo per sheet. Excel sheet-naam-validatie (1–31 chars, geen \:/?*[]).
⨁ Rij- & kolom-CRUD
Insert/Remove voor zowel rijen als kolommen, undo-baar via Insert/RemoveRowCommand en Insert/RemoveColCommand. Style-shift wordt automatisch meegedaan zodat opmaak op de juiste cel blijft staan na een insert/delete.
≡ SQL-builder met JOINs
Volledige SQL via AlaSQL met visuele query-builder: FROM-dropdown over alle sheets, JOIN-rij-builder met auto-suggesties uit het relaties-tabblad. SQL-result als read-only view onafhankelijk van source-data. Filter en SQL exclusief.
🔗 Relaties-tabblad (FK-CRUD)
Apart tabblad waar je foreign-key-relaties CRUD'd tussen je sheets: (from-table, from-col, to-table, to-col, type). Auto-suggesties op basis van kolom-naam-match. Relaties voeden de JOIN-suggesties in de SQL-builder.
B I U Opmaak per cel
Acht style-attributen per cel: bold/italic/underline/strike/kleur/background/font-size/alignment. Per sheet bewaard. Bij Excel-export omgezet naar native cell-styles, bij CSV-export naar __style_*-kolommen (toggleable).
📄 Multi-tabel CSV-met-metadata
Sla meerdere tabellen, relaties én query-output op in één CSV-bestand via marker-conventie: # TABLE, # RELATIONS, # QUERY, # QUERY_OUTPUT. Alle tooling die CSV leest blijft werken — SheetHorse herkent de markers en bouwt het hele workbook terug.
🔍 Zoek/vervang & autosave
Regex, case-toggle, scope-keuze. Vervang-alle als 1 undo-step. Throttled autosave naar localStorage per session, met restore-banner bij heropenen.
Gepland (volgt de komende releases)
⚡ Virtual scrolling v0.7.0
Virtual-scroll-rendering zodat SheetHorse comfortabel doorschaalt naar 100 k+ rijen per sheet zonder DOM-bloat. CSVHorse-architectuur is hierop voorbereid; in SheetHorse moet de multi-sheet state-switcher mee.
📝 Query-output als sheet v0.8.0
SQL-resultaat én query opslaan als een speciaal tabblad (_query-sheet), zodat dashboards in Excel/CSV bewaard blijven — ook na een roundtrip door SheetHorse heen.
🌐 Deploy naar icthorse.nl v1.0.0
Stable-release met eigen URL onder icthorse.nl/sheethorse/ naast de GitHub Pages-build. Publieke launch en handmatige QA.
Roadmap
| v0.0.1 | Haflinger | Fork van CSVHorse v0.2.0.2 + naam-shift + skeleton-docs (LIVE) |
| v0.1.0 | Lipizzaner | Excel (.xlsx) import + export met opmaak-mapping (LIVE) |
| v0.1.0.1 | Lipizzaner | Cherry-pick header-edit van CSVHorse main (LIVE) |
| v0.2.0 | Andalusian | Multi-sheet runtime: tab-strip + per-sheet state + multi-sheet XLSX I/O (LIVE) |
| v0.3.0 | Trakehner | Relaties-tabblad met FK-CRUD en cardinaliteit (LIVE) |
| v0.4.0 | Akhal-Teke | SQL met joins over multi-sheet (LIVE) |
| v0.5.0 | Knabstrupper | CSV-met-metadata-format: multi-tabel via # TABLE/# RELATIONS/# QUERY-markers (LIVE) |
| v0.6.0 | Hanoverian | Rij- & kolom-CRUD met style-shift + SQLBuilder FROM-dropdown + JOIN-builder met auto-suggest uit relaties (LIVE) |
| v0.6.0.1 | Hanoverian | XLSX-import lift __style_*-kolommen samen met native Excel cell-styles (LIVE) |
| v0.6.0.2 | Hanoverian | Wis SQL-knop leegt nu ook de textarea (LIVE) |
| v0.7.0 | tbd | Virtual scrolling voor 100 k+ rijen per sheet |
| v0.8.0 | tbd | Query-output als bewaarbaar _query-tabblad (roundtrip) |
| v1.0.0 | Lusitano | Stable public release + deploy icthorse.nl/sheethorse/ |
Architectuur
SheetHorse deelt zijn fundament met CSVHorse: vanilla JavaScript, geen framework, alle vendor-libraries inline opgenomen met SHA-256-hash gepind. Bovenop CSVHorse zit één extra vendored library: xlsx-populate 1.21.0 (~640 KB minified, MIT) voor de Excel-roundtrip. De DataStore is gerefactored naar een multi-sheet structuur waarin elke sheet een eigen state-snapshot heeft (rows, cols, styles, dialect, undo-stack, filter-state, selectie, search-state).
De volledige architectuur (componenten, data-flow, branch-split, roadmap) is interactief te bekijken in de SheetHorse architectuurviewer — ArchiMate-stijl, deterministisch, met JSON/.archimate/SVG-export voor import in Archi-tool of ArchiMate-compatibele EA-tools.
Technische specificaties
| Single-file deliverable | één index.html (~1.34 MB minified, incl. PapaParse + AlaSQL + xlsx-populate) |
| Bundle | Vanilla JS · PapaParse 5.4.1 · AlaSQL 4.17.3 · xlsx-populate 1.21.0 (alle MIT) |
| Browser-target | Chrome / Firefox / Safari / Edge laatste 2 versies |
| Schaal per sheet | ~5 000 rijen comfortabel (virtual scrolling roadmap) |
| Multi-sheet limit | Geen harde limiet — afhankelijk van browser-memory (typisch 50+ sheets prima) |
| Privacy | 100% client-side — geen netwerk, geen tracking, geen accounts |
| Storage | Browser localStorage per session (max ~5 MB) — optioneel |
| Licentie | AGPL-3.0 (publiek open-source) |
| Branch | sheethorse in cpaglebbeek/CSVHorse |
| Codenaam-thema | Paardenrassen (huidige release: v0.6.0.2-Hanoverian) |
Wanneer kies je CSVHorse?
- simpel een CSV wilt openen, queryen, bewerken en exporteren;
- geen Excel-bestanden hoeft te lezen of schrijven;
- een kleinere bundel wilt (~660 KB vs 1.34 MB) en minder "cognitive load".
Branch-strategie & bug-management
CSVHorse en SheetHorse delen dezelfde GitHub-repository in twee branches: main (CSVHorse-light, stabiel) en sheethorse (SheetHorse-full, actief). Bugs zijn vaak shared (DOM-handling, vendor-libraries). Onze interne /bugcheck-procedure scant beide branches bij elke audit. Een bug-fix op de gedeelde basis wordt naar beide branches gepushed.
De deployment is volledig geautomatiseerd via GitHub Actions: een push naar main of sheethorse triggert een gecombineerde Pages-build. De landing-page op cpaglebbeek.github.io/CSVHorse/landing.html toont beide producten naast elkaar.
Aan de slag
Open SheetHorse → Architectuurviewer CSVHorse-lancering