Meltype
This is Japanese input that melts the wall between half-width and full-width, like thawing snow.
AI translation
Omni-Tableur : un tableur simple qui fonctionne hors ligne. Les données restent sur l'appareil.
Translation pending
ProductivityJavaScript · HTMLGitHub @FerrusDantiochOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Omni-Tableur est un tableur simple (comme Excel ou Google Sheets, pour les analyses courantes) qui s'installe sur un ordinateur ou un téléphone Android, comme une application classique.
Ouvrir l'application : https://ferrusdantioch.github.io/omni-tableur/
(dépôt GitHub FerrusDantioch/omni-tableur).
L'application s'appelait « Tableur » jusqu'à la version 2.0.0, et son dépôt
aussi. Le dépôt a depuis été renommé omni-tableur, ce qui a changé son
adresse : si tu l'avais installée depuis l'ancienne adresse …/Tableur/,
désinstalle-la puis réinstalle-la depuis la nouvelle (voir partie 6).
Le plus important : la partie 1 explique comment ne jamais perdre un classeur (faire régulièrement un export .json).
| Sauvegarde automatique | Export .json (copie complète) | Export CSV (valeurs seulement) | |
|---|---|---|---|
| Comment | Rien à faire : à chaque modification | Onglet « Données » → Exporter → Exporter le classeur (.json) | Onglet « Données » → Exporter → Exporter la feuille (.csv) |
| Où | Dans le navigateur de l'appareil | Un fichier omni-tableur-AAAA-MM-JJ.json dans les téléchargements, à ranger où tu veux | Un fichier .csv dans les téléchargements |
| Ce qu'il garde | Tout | Tout : toutes les feuilles (noms et ordre), textes et formules, mise en forme, bordures, largeurs, ligne figée, cellules fusionnées, règles de couleurs, feuille affichée, thème et zoom | Une seule feuille, et seulement les valeurs : les formules sont remplacées par leur résultat, sans mise en forme |
| Pour quoi faire | Retrouver son travail en rouvrant l'application | Copie de sécurité ; passer d'un appareil à l'autre | Ouvrir le tableau dans Excel, LibreOffice ou Google Sheets |
| Disparaît si… | …on efface les données du navigateur, on désinstalle, ou on change d'appareil | …on supprime le fichier soi-même | …on supprime le fichier soi-même |
| Pour le rouvrir | Automatique | Importer → Importer un classeur (.json) | Importer → Importer un CSV (dans une nouvelle feuille) |
(L'export PDF, lui, sert à imprimer ou envoyer un tableau figé : il ne se rouvre pas dans l'application.)
Conseil de sécurité : la sauvegarde automatique reste dans le navigateur. Fais régulièrement un export .json — par exemple chaque semaine, et toujours après une grosse séance de travail — et range le fichier ailleurs que sur l'appareil (clé USB, cloud, e-mail à toi-même). C'est ta vraie copie de secours : avec elle, rien n'est perdu si le navigateur est vidé ou si le téléphone change.
Bon à savoir
"version": 1) :
les versions futures de l'application sauront relire les anciens fichiers.La barre d'outils est rangée en quatre onglets : Édition, Mise en forme, Bordures, Données. Toucher l'onglet déjà ouvert replie la barre (plus de place pour la grille sur téléphone). Annuler, Rétablir, À propos et Menu restent toujours visibles en haut ; le zoom et les onglets des feuilles sont en bas.
3,5 (ou 3.5), 1 234, 12,50 €,
20 %, VRAI / FAUX, dates 23/10/2026. Une apostrophe force le texte : '0612.#REF! si une cellule utilisée disparaît).SOMME…).=B1 quand A1:C1
est fusionnée) utilise la cellule en haut à gauche ; une plage
(=SOMME(A1:C1)) compte chaque case une seule fois, comme dans Excel ;1 234,50), euros, pourcentage, date,
et nombre de décimales. Le format ne change que l'affichage : les calculs
gardent le nombre exact.B2:B20), une condition
(« supérieure à », « inférieure à », « égale à », « entre », « négative »,
« contient le texte ») et une couleur de fond et/ou de texte. Plusieurs
règles par feuille ; la fenêtre les liste, avec Modifier et
Supprimer. Les couleurs se recalculent toutes seules quand les valeurs
changent, suivent les insertions et suppressions de lignes, et
apparaissent dans le PDF. Si deux règles colorent la même cellule, la
première de la liste l'emporte.A2:C14).= est une formule : + - * /, ^, %,
& (assembler du texte), comparaisons = <> < > <= >=, références
(=A1+B2, $A$1 pour figer), plages (A1:A10, colonne entière A:A),
cellules d'une autre feuille (=Feuille2!A1, ='Mes ventes'!B2:B10).;, comme dans Excel en français :
=SI(A1>10;"oui";"non").="oui"="Oui" est VRAI), & écrit 2,5 et VRAI, et
=0,1+0,2=0,3 est VRAI.Les 37 fonctions disponibles (noms français) :
| Fonction | Ce qu'elle fait | Exemple |
|---|---|---|
| SOMME | additionne | =SOMME(A1:A10) |
| MOYENNE | moyenne des nombres | =MOYENNE(B2:B8) |
| MEDIANE | valeur du milieu (moins sensible qu'une moyenne à une valeur extrême) | =MEDIANE(1;2;100) → 2 |
| MIN, MAX | plus petit, plus grand nombre | =MAX(C1:C20) |
| NB | compte les cellules qui contiennent un nombre | =NB(A1:A100) |
| NBVAL | compte les cellules non vides | =NBVAL(A1:A100) |
| PRODUIT | multiplie | =PRODUIT(A1:A3) |
| ARRONDI, ARRONDI.SUP, ARRONDI.INF | arrondit (au plus près, au-dessus, en dessous) | =ARRONDI(A1;2) |
| ENT | partie entière | =ENT(7,8) → 7 |
| ABS | valeur sans le signe | =ABS(-5) → 5 |
| MOD | reste d'une division | =MOD(10;3) → 1 |
| RACINE | racine carrée | =RACINE(16) → 4 |
| PUISSANCE | puissance | =PUISSANCE(2;10) → 1024 |
| SI | un résultat ou l'autre selon une condition | =SI(A1>100;"cher";"ok") |
| ET, OU, NON | combinent des conditions | =ET(A1>0;A1<10) |
| SIERREUR | valeur de secours si le calcul échoue | =SIERREUR(A1/B1;0) |
| NB.SI | compte les cellules qui respectent un critère | =NB.SI(B2:B20;">10") |
| SOMME.SI, MOYENNE.SI | somme ou moyenne selon un critère | =SOMME.SI(A2:A9;"Loyer";B2:B9) |
| NB.SI.ENS | compte les lignes qui respectent toutes les conditions | =NB.SI.ENS(A2:A9;"Courses";B2:B9;">50") |
| SOMME.SI.ENS, MOYENNE.SI.ENS |
">5", "<=2,5", "<>0", "pomme", "P*" (jokers * et ?), ""
(cellules vides), ">=01/01/2026". Dans une fonction .ENS, toutes les
plages doivent avoir la même taille (sinon #VALEUR!).=B1-A1 donne l'écart en jours).#DIV/0!, #VALEUR!, #REF!, #NOM?, #N/A,
#ERREUR!, #CIRC! (la formule dépend d'elle-même), #NOMBRE!. Une
explication en français s'affiche en bas de l'écran.| Raccourci | Action |
|---|---|
| Ctrl + Z / Ctrl + Y | annuler / rétablir |
| Ctrl + C / X / V | copier / couper / coller |
| Ctrl + D / Ctrl + R | recopier vers le bas / vers la droite |
| Ctrl + B / Ctrl + I | gras / italique |
| Ctrl + F / Ctrl + H | rechercher / remplacer |
| Ctrl + A | tout sélectionner |
| Ctrl + P | exporter en PDF |
| Ctrl + molette | zoom |
| F2 | modifier la cellule |
| Suppr | vider les cellules sélectionnées |
Ouvrir index.html par un double-clic ne marche pas : le navigateur bloque
les modules JavaScript ouverts depuis un fichier. Il faut un petit serveur web
local. Il est fourni (outils/serveur.mjs) et n'a besoin que de Node.js.
Une seule fois : installer Node.js
À chaque essai (Windows)
omni-tableur.cmd, puis appuie sur Entrée. Une fenêtre noire s'ouvre.node outils/serveur.mjs puis appuie sur Entrée.http://localhost:8000/omni-tableur/.Sur Mac : ouvre l'application « Terminal », tape cd (avec un espace),
glisse le dossier omni-tableur dans la fenêtre, appuie sur Entrée, puis suis les
étapes 4 à 7 ci-dessus.
Sur ton téléphone : le plus simple est de publier l'application (partie 4) et d'ouvrir son adresse sur le téléphone.
Le code est sur GitHub, dans le dépôt FerrusDantioch/omni-tableur. La
version publiée est celle de la branche main ; chaque mise à jour est
préparée sur une branche de travail. Tous les chemins de l'application sont
relatifs : elle fonctionne dans le sous-dossier /omni-tableur/.
Publier une mise à jour
omni-tableur.main.
(Tu peux aussi me demander de préparer cette « pull request ».)https://ferrusdantioch.github.io/omni-tableur/.
Si l'application était déjà ouverte, un bandeau propose « Recharger ».Si GitHub Pages n'est pas encore activé : onglet « Settings » du dépôt →
« Pages » (colonne de gauche) → sous « Branch », choisis main puis / (root)
→ « Save ».
Le dossier tests et le fichier package.json sont publiés aussi, mais ne
servent qu'aux vérifications : ils ne gênent pas l'application.
Publier une mise à jour plus tard
js/config.js (par exemple 2.1.0 devient 2.1.1).main.Sans changement de version, les utilisateurs gardent l'ancienne version (l'application est conservée sur leur appareil pour marcher hors ligne).
ferrusdantioch.github.io. Si Chrome
répond « Cette appli est déjà installée », utilise Brave, ou choisis
« Créer un raccourci ».Le code est séparé en trois couches, pour pouvoir ajouter plus tard des graphiques ou l'import Excel sans tout refaire :
index.html la page (barres, grille, fenêtres)
manifest.webmanifest carte d'identité de l'application installable
sw.js copie hors ligne de l'application (service worker)
js/config.js nom, version, auteurs — LE fichier à modifier pour publier une version
js/app.js assemble toutes les parties (seul fichier qui les connaît toutes)
js/donnees/ (a) LES DONNÉES — ce que tu as saisi
adresses.js « B3 » ↔ ligne 3, colonne 2 ; plages A1:C3 ; taille maximale
saisie.js comprend ce qui est tapé (nombre, texte, formule, €, %, date)
classeur.js le classeur : feuilles, cellules, mise en forme, annuler/rétablir,
insertion/suppression de lignes, feuilles, enregistrement
formules.js lit et réécrit les références des formules (A1, $A$1, Feuille2!A1…)
fusions.js cellules fusionnées : sélection agrandie, insertion et suppression
regles.js règles de mise en forme conditionnelle (description, vérification)
fichier-classeur.js fichier de sauvegarde complète (.json) : création et vérification
recopie.js poignée de recopie : formules adaptées, suites 1, 2, 3…
recherche.js rechercher et remplacer (texte cherché, ordre de lecture, remplacements)
bordures.js pose des bordures (toutes, extérieure…) et traits à dessiner
tri.js tri : tableau autour de la cellule, ligne de titres, ordre
graphique.js graphique : catégories et séries d'un tableau, graduations, parts
js/calcul/ (b) LE CALCUL DES FORMULES
traduction.js formules françaises → bibliothèque (SOMME → SUM, « ; » → « , »)
moteur.js calcule, suit les dépendances (entre feuilles aussi), recalcule
fonctions.js fonctions écrites pour Omni-Tableur (NB.SI, RECHERCHEV, MAJUSCULE…)
comparaisons.js comparaisons et critères à la française
conditions.js mise en forme conditionnelle : la cellule respecte-t-elle la règle ?
erreurs.js #DIV/0!, #REF!… et leurs explications
bibliotheque.js accès à la bibliothèque fast-formula-parser
js/affichage/ (c) L'AFFICHAGE
grille.js dessine la grille (lignes visibles seulement), ligne figée, sélection
interactions.js clavier, souris, doigt, poignée de recopie
edition.js saisie dans la cellule et dans la barre « fx »
selection.js cellule active et plage sélectionnée
zoom.js zoom de la grille (boutons, deux doigts, Ctrl + molette)
format.js nombres à la française (3,5 ; 12,50 € ; 23/10/2026)
barre-outils.js onglets de la barre d'outils, panneaux
commandes-edition.js recopier, insérer, supprimer, effacer
commandes-fusion.js bouton « Fusionner / Défusionner »
conditions.js fenêtre « Mise en forme conditionnelle »
graphique.js fenêtre « Graphique » et enregistrement de l'image
dessin-graphique.js dessin du graphique en SVG (colonnes, courbe, secteurs)
mise-en-forme.js gras, italique, couleurs, alignement, retour à la ligne, formats, largeurs
outils-bordures.js onglet « Bordures »
commandes-donnees.js trier, figer la 1re ligne, importer un CSV
onglets-feuilles.js onglets des feuilles (ajouter, renommer, supprimer)
presse-papiers.js copier, couper, coller
recherche.js barre « Rechercher et remplacer »
sauvegarde-fichier.js boutons « Exporter / Importer un classeur (.json) »
menu.js, fenetres.js menu, « À propos » et fenêtres
js/services/ sauvegarde, thèmes, exports PDF et CSV, import CSV, application installable
css/ apparence (themes.css = toutes les couleurs)
vendor/ bibliothèque de formules (non modifiée)
fonts/, icons/, assets/ polices, icônes, logo
licences/ textes des licences des bibliothèques et polices
outils/ serveur local, création des icônes
tests/ vérifications automatiques
js/config.js. Si tu changes le nom, change-le aussi
dans manifest.webmanifest (un test vérifie que les deux correspondent).idStockage: 'omni-tableur' dans js/config.js : les
classeurs déjà enregistrés deviendraient invisibles. (Il valait 'tableur'
avant le renommage : js/services/stockage.js déplace une seule fois les
données de l'ancien nom vers le nouveau — copie, vérification, puis
effacement de l'ancien exemplaire.)omni-tableur : l'adresse de
l'application (…github.io/omni-tableur/) changerait encore."id": "/Tableur/" dans manifest.webmanifest, même
s'il garde l'ancien nom : c'est un identifiant invisible, pas une adresse. Chrome
le lit à partir de la racine du site (https://ferrusdantioch.github.io/) :
"./" aurait donné à l'application l'identité de la racine, la même que
d'autres applications du site. Et une application déjà installée dont l'id
change devient, pour Chrome, une autre application.css/themes.css (un bloc par thème). Le test
tests/unitaires/contrastes.test.mjs vérifie que le texte et les bordures restent lisibles.js/calcul/traduction.js,
ajoute une ligne à la liste FONCTIONS (nom français → nom anglais de la
bibliothèque, par exemple ECARTYPE: 'STDEV.S'), puis un test dans
tests/unitaires/fonctions.test.mjs. Vérifie le résultat : si la fonction
de la bibliothèque ne se comporte pas comme Excel, écris-la dans
js/calcul/fonctions.js (c'est ce qui a été fait pour NB.SI ou RECHERCHEV).FICHIERS de sw.js, sinon il manquera hors ligne (un test le vérifie).python3 outils/creer-icones.py (il faut Python et Pillow).npm test : tests des formules, des données, des fusions, des règles de
couleurs, de la recherche, du fichier .json (y compris un classeur complexe
exporté puis réimporté à l'identique, et des fichiers invalides refusés),
des exports, des contrastes et de la liste hors ligne. N'a besoin que de
Node.js, version 22 ou plus récente (rien d'autre à installer).npm run test:navigateur : tests dans un vrai navigateur, à la souris, au
clavier et au doigt (téléphone imité) : saisie, onglets, tri, import et
export, sauvegarde, passage de l'ancien nom au nouveau, zoom, recherche,
fusion, mise en forme conditionnelle, retour à la ligne, graphiques,
thèmes, hors ligne, PDF. Il faut
d'abord, une seule fois : npm install puis npx playwright install chromium.SI qui ne calcule que la branche choisie
(=SI(B1=0;"";A1/B1) marche), références vers d'autres feuilles, erreurs
claires ; elle donne aussi la liste des cellules utilisées par chaque
formule, ce qui permet le recalcul automatique. Ses manques ou écarts avec
Excel en français sont comblés dans js/calcul/fonctions.js (MIN, MAX,
MAJUSCULE, NB.SI qui comptait le texte, RECHERCHEV sensible aux
majuscules, & qui écrivait « 2.5 » et « TRUE »…), sans toucher au
fichier de la bibliothèque. hot-formula-parser est abandonnée par ses
auteurs (remplacée par HyperFormula, sous licence GPL) ; formula.js ne sait
pas lire une formule, seulement calculer des fonctions.; entre les colonnes, virgule décimale,
dates jj/mm/aaaa, UTF-8 avec BOM.index.html), le contenu des cellules est toujours affiché comme du texte,
un fichier CSV importé ne peut pas lancer de formule, et un fichier .json
importé est lu comme de simples données (JSON.parse), vérifié en entier
avant de remplacer quoi que ce soit.js/affichage/dessin-graphique.js)
et moteur.abonner(…) prévient à chaque changement de valeur ; il
faudrait enregistrer la plage et le type dans la feuille (comme les règles
de couleurs), et les décaler quand on insère des lignes (ajusterPlage).classeur.ajouterFeuille({ nom, donnees }), comme le fait déjà l'import CSV.classeur.versJSON() / classeur.charger()), et tout
l'enregistrement passe par js/services/stockage.js.js/calcul/traduction.js, et si besoin la fonction dans js/calcul/fonctions.js.© 2026 Ferrus Dantioch — Creative Commons BY-NC-ND 4.0 (résumé de la licence en français)
En clair : le partage est autorisé, à l'identique et en citant l'auteur ; l'usage commercial est interdit ; la modification et les œuvres dérivées sont interdites. Le logiciel est fourni « en l'état », sans aucune garantie.
Texte complet dans le fichier LICENSE : le texte officiel en anglais, suivi de la traduction française officielle publiée par Creative Commons.
Les bibliothèques et polices d'autres auteurs gardent leur propre licence : voir LICENCES.md.
| somme ou moyenne avec plusieurs conditions (la plage à calculer vient en premier) |
=SOMME.SI.ENS(C2:C9;A2:A9;"mars";B2:B9;"Courses") |
| RECHERCHEV | cherche une valeur dans la 1re colonne d'un tableau | =RECHERCHEV("Poire";A2:C9;3;FAUX) |
CONCATENER (et &) | assemble des textes | =A1&" "&B1 |
| MAJUSCULE, MINUSCULE | change la casse | =MAJUSCULE(A1) |
| NBCAR | nombre de caractères | =NBCAR(A1) |
| AUJOURDHUI | date du jour | =AUJOURDHUI() |
| DATE | fabrique une date | =DATE(2026;10;24) |
| ANNEE, MOIS, JOUR | parties d'une date | =MOIS(A1) |