Je cherche à faire une recherche multiple par excel sur mon site.
C'est à dire que les utilisateurs envoie un fichier excel avec tous les noms des produits et je veux lire ce fichier sans le télécharger et faire une recherche multiple comme sur "octopart.com".

Je voudrais donc savoir si il est possible de lire dans un fichier sans le télécharger, si oui comment ?

11 réponses


JeMenBeur
Auteur
Réponse acceptée

MAJ: Tout fonctionne !
J'ai tout changé et j'ai utilisé read-excel-file, ça m'as permis de lire beaucoup plus facilement le fichier.
Voici le code pour ceux qui ont besoin.

Voici l'entete de l'ensemble des pages :

<header>
    <div class="header-first">
        <div class="logo-novatech-header">
            <a href="/index.php">
                <img src="img/logo_novatech.png" alt="logo novatech" class="logo-novatech">
            </a>
        </div>
        <div class="search">
            <form method="POST" action="/products.php" id="search-form">
                <input class="search-mpn" name="MPN" id="MPN-simple" type="text">
                <input class="btn-search-mpn" type="image" src="img/loupe.jpg" alt="submit form">
                <!-- <input class="btn-search-multiple-mpn" type="image" src="img/flèche-bas.png" alt="recherche multiple"> -->
                <input type="file" id="readFile" alt="submit form"><br>
                <input type="hidden" id="multiple-MPN-hidden" name="multiple-MPN-hidden">
            </form>
        </div>
        <!-- <div class="header-right">
            <label class="language">Choix de la langue :</label>
            <div class="flag">
                <img src="img/drapeau_francais.jpg" alt="drapeau français" class="drapeau-francais">
                <img src="img/drapeau_royaume_uni.jpg" alt="drapeau royaume uni" class="drapeau-royaume-uni">
            </div>
        </div> -->
    </div>
    <div class="header-second" data-sticky>
        <a href="/products.php">Produits</a>
        <a href="/contact.php">Contact</a>
        <a href="/presentation_entreprise.php">A propos de nous</a>
        <a href="/cart.php"><img src="img/cart.png" alt="panier" class="cart"></a>
    </div>

    <div id="ExcelTable"></div>
</header>

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://unpkg.com/read-excel-file@5.x/bundle/read-excel-file.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
    var tableau = new Array();

    const input = document.getElementById('readFile');

    input.addEventListener('change', () => {
        readXlsxFile(input.files[0]).then((rows) => {
            // `rows` is an array of rows
            // each row being an array of cells.
            rows.forEach(row => {
                row.forEach(element => {
                    if (element != null) {
                        tableau.push(element);
                    }
                });
            });
            if (tableau.length > 0) {
                var mpns = tableau.join(',');
                document.getElementById('multiple-MPN-hidden').value = mpns;
                document.getElementById('MPN-simple').value = "";
                document.getElementById('search-form').submit();
            }
        })

    })
</script>

Ensuite sur la page de destination, ici products.php il suffit juste de récupérer la valeur dans le POST.

$_POST['multiple-MPN-hidden']
JeMenBeur
Auteur
Réponse acceptée

C'est bon cela fonctionne parfaitement, j'ai tout changé et j'ai utilisé read-excel-file.

<header>
    <div class="header-first">
        <div class="logo-novatech-header">
            <a href="/index.php">
                <img src="img/logo_novatech.png" alt="logo novatech" class="logo-novatech">
            </a>
        </div>
        <div class="search">
            <form method="POST" action="/products.php" id="search-form">
                <input class="search-mpn" name="MPN" id="MPN-simple" type="text">
                <input class="btn-search-mpn" type="image" src="img/loupe.jpg" alt="submit form">
                <!-- <input class="btn-search-multiple-mpn" type="image" src="img/flèche-bas.png" alt="recherche multiple"> -->
                <input class="btn-search-multiple-mpn" type="file" id="readFile" alt="submit form">
                <input type="hidden" id="multiple-MPN-hidden" name="multiple-MPN-hidden">
            </form>
        </div>
        <!-- <div class="header-right">
            <label class="language">Choix de la langue :</label>
            <div class="flag">
                <img src="img/drapeau_francais.jpg" alt="drapeau français" class="drapeau-francais">
                <img src="img/drapeau_royaume_uni.jpg" alt="drapeau royaume uni" class="drapeau-royaume-uni">
            </div>
        </div> -->
    </div>
    <div class="header-second" data-sticky>
        <a href="/products.php">Produits</a>
        <a href="/contact.php">Contact</a>
        <a href="/presentation_entreprise.php">A propos de nous</a>
        <a href="/cart.php"><img src="img/cart.png" alt="panier" class="cart"></a>
    </div>

    <div id="ExcelTable"></div>
</header>

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://unpkg.com/read-excel-file@5.x/bundle/read-excel-file.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
    var tableau = new Array();

    const input = document.getElementById('readFile');

    input.addEventListener('change', () => {
        readXlsxFile(input.files[0]).then((rows) => {
            // `rows` is an array of rows
            // each row being an array of cells.
            rows.forEach(row => {
                row.forEach(element => {
                    if (element != null) {
                        tableau.push(element);
                    }
                });
            });
            if (tableau.length > 0) {
                var mpns = tableau.join(',');
                document.getElementById('multiple-MPN-hidden').value = mpns;
                document.getElementById('MPN-simple').value = "";
                document.getElementById('search-form').submit();
            }
        })

    })
</script>

Ensuite il suffit juste de récupérer sur la page de destination (products.php) avec :
$_POST['multiple-MPN-hidden']

Je pense avoir fait la première partie de la réponse mais je n'arrive pas à lire le fichier excel.

<input type="file" onchange="readFile()"><br>
<script>
    function readFile() {
        var file = document.querySelector('input[type=file]').files[0];
        console.log(file);
    }
</script>

Normalement j'arrive bien à récupérer le fichier mais maintenant je cherche à lire les lignes à l'intérieur.

Voici la solution pour ceux qui ont besoin. Elle n'est surement pas optimisé mais elle fonctionne. Je récupère les données dans le tableau "tableau".

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
    function UploadProcess() {

        var file = document.querySelector('input[type=file]').files[0];
        parseExcel(file);

        var tableau = new Array();
        var tableauTemporaire1 = new Array();

        function parseExcel(file) {
            var reader = new FileReader();

            reader.onload = function(e) {
                var data = e.target.result;
                var workbook = XLSX.read(data, {
                    type: 'binary'
                });

                var num = 1;
                workbook.SheetNames.forEach(function(sheetName) {
                    // Here is your object
                    var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
                    var json_object = JSON.stringify(XL_row_object);
                    json_object = JSON.parse(json_object);
                    for (var mpn in json_object[0]) {
                        tableau.push(mpn);
                    }
                    for (i = 0; i < json_object.length; i++) {
                        tableauTemporaire = Object.values(json_object[i]);
                        tableau = tableau.concat(tableauTemporaire);
                    }
                    console.log(tableau);
                })
            };

            reader.onerror = function(ex) {
                console.log(ex);
            };

            reader.readAsBinaryString(file);
        };
    };
</script>

Bon a savoir :o
Perso je suis sur Laravel et j'utilise un paquet Spatie, comme ça y'a pas besoin de fabriquer un système x)
Mais en JS je ne sais pas si y'a un paquet qui existe déjà pour lire des fichier, je garde ton code de coté au cas ou :p

Ah apparement y'a des paquets ^^
Recherches sur google "npm read excel" tu auras quelques paquets tout fait pour lire des fichiers excell (regarde bien à quand date la dernière mise a jour, il faut une release d'un mois maximum sinon c'est un projet abandonné)
Pour trouver des paquets js tu fais "npm {ce que tu veux}" et en général y'a toujours un dev qui a publié un outil, vive l'open source :p

Ah d'accord merci je regarderais ça plus tard.
Sinon du coup maintenant j'essaye d'envoyer mon tableau de javascript vers PHP pour pouvoir faire la requête SQL pour la recherche mais ça ne fonctionne pas vraiment.
Je ne sais pas si il y a une façon plus simple de le faire.

Avec la function callScri, je veux envoyé les informations en POST mais je n'arrive pas à récupérer les informations sur la page produit.
Du coup je sais pas si c'est l'envoi ou la réception que je fais mal ou les deux ^^

<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
    //permet d'envoyer un tableau javascript vers une page php en $_POST
    function callScri(scriptName, args) {
        args = "TabName=test";
        var xhr_object = null;
        if (window.XMLHttpRequest)
            xhr_object = new XMLHttpRequest();
        else if (window.ActiveXObject) xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
        else {
            alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
            return http;
        }
        xhr_object.open("POST", scriptName, true);
        xhr_object.onreadystatechange = function() {
            if (xhr_object.readyState == 4) {
                // code
            }
            return xhr_object.readyState;
        }
        xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        console.log(args);
        xhr_object.send(args);
        //document.location.href = "products.php";
    }

    //permet de récupérer les valeurs MPN du fichier excel
    function UploadProcess() {

        var file = document.querySelector('input[type=file]').files[0];
        parseExcel(file);

        var tableau = new Array();
        var tableauTemporaire1 = new Array();
        var num = 0;
        var data = "";

        function parseExcel(file) {
            var reader = new FileReader();

            reader.onload = function(e) {
                var data = e.target.result;
                var workbook = XLSX.read(data, {
                    type: 'binary'
                });

                workbook.SheetNames.forEach(function(sheetName) {
                    // Here is your object
                    var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
                    var json_object = JSON.stringify(XL_row_object);
                    json_object = JSON.parse(json_object);
                    for (var mpn in json_object[0]) {
                        tableau.push(mpn);
                        num = 1;
                    }
                    for (i = 0; i < json_object.length; i++) {
                        tableauTemporaire = Object.values(json_object[i]);
                        tableau = tableau.concat(tableauTemporaire);
                        num = 1;
                    }
                    // console.log(tableau);
                    // console.log(tableau.length);
                    data = "TabMPN=" + tableau;
                    callScri("products.php", data);
                })
            };

            reader.onerror = function(ex) {
                console.log(ex);
            };

            reader.readAsBinaryString(file);
        };
    };
</script>

XMLHttpRequest c'est trop vieux tu vas galerer, essayes avec axios, c'est beaucoup plus simple:
https://www.npmjs.com/package/axios

Tu déclares axios, et ensuite tu fais axios.post('ta-route', {...tes données}) (enfin en gros, pour voir en détail regardes la doc :p)
et paf c'est envoyé à php :)

Je viens de changer tout ce que j'ai fais pour que cela soit plus simple. Du coup maintenant tout fonctionne seulement quand j'ai un window.alert ^^.
Je sais pas comment c'est possible mais quand je commente ça ne fonctionne pas, le var_dump me dit que c'est vide.
Quand le var_dump n'est pas vide et que j'arrive à récupérer les informations de l'excel, la recherche fonctionne parfaitement, les bons produits s'affiche.

<form method="POST" action="/products.php" id="search-form">
                <input class="search-mpn" name="MPN" id="MPN-simple" type="text">
                <input class="btn-search-mpn" type="image" src="img/loupe.jpg" alt="submit form">
                <!-- <input class="btn-search-multiple-mpn" type="image" src="img/flèche-bas.png" alt="recherche multiple"> -->
                <input type="file" id="readFile" onchange="UploadProcess()" alt="submit form"><br>
                <input type="hidden" id="multiple-MPN-hidden" name="multiple-MPN-hidden">
            </form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script>
<script>
    function UploadProcess() {
        console.log('test');
        var file = document.querySelector('input[type=file]').files[0];

        var tableau = new Array();
        var tableauTemporaire1 = new Array();
        var num = 0;
        var data = "";

        function parseExcel(file) {
            var reader = new FileReader();

            reader.onload = function(e) {
                var data = e.target.result;
                var workbook = XLSX.read(data, {
                    type: 'binary'
                });

                workbook.SheetNames.forEach(function(sheetName) {
                    // Here is your object
                    var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
                    var json_object = JSON.stringify(XL_row_object);
                    json_object = JSON.parse(json_object);
                    for (var mpn in json_object[0]) {
                        tableau.push(mpn);
                        num = 1;
                    }
                    for (i = 0; i < json_object.length; i++) {
                        tableauTemporaire = Object.values(json_object[i]);
                        tableau = tableau.concat(tableauTemporaire);
                        num = 1;
                    }
                })
            };

            reader.onerror = function(ex) {
                console.log(ex);
            };

            reader.readAsBinaryString(file);
        };

        parseExcel(file);
        // document.getElementById('multiple-MPN-hidden').setAttribute("value", mpns);
        // document.getElementById('MPN-simple').setAttribute("value", "");

        window.alert(tableau);
        window.alert(tableau.join(','));
        var mpns = tableau.join(',');
        document.getElementById('multiple-MPN-hidden').value = mpns;
        document.getElementById('MPN-simple').value = "";
        document.getElementById('search-form').submit();
    };
</script>

Ensuite après avoir ajouter la value à l'input 'multiple-MPN-hidden', avoir submit le formulaire et rediriger vers products.php.
Dans products.php je fais un var_dump et du coup comme je disais le var_dump n'est pas vide quand j'ai les alert.

var_dump($_POST['multiple-MPN-hidden']);

Mmmmh... et si tu vardump document.getElementById('multiple-MPN-hidden').value = mpns; ça donne quelque chose?
Et dans ton proucts, si tu vardump just $_POST, tout est vide ou bien il y'a les autres données qui passent?

Top! C'est pratique de profiter de l'open source x)

Ouai carrément et merci de ton aide !