web-dev-qa-db-fra.com

php + jqgrid + export pour exceller

Quelqu'un sait comment exporter les données d'un jqgrid pour exceller?

Je veux faire un rapport en utilisant ce jqgrid que je pense est génial. Mais j’ai besoin de sauvegarder ou d’imprimer ce rapport d’une façon ou d’une autre, car faut-il conserver les informations. Quelqu'un sait comment faire ??

19
Paulo

Ceci est mon approche, ajoutez simplement ce code à votre fichier js/html

$("#list").jqGrid('navGrid', '#pager',{view:true, del:false, add:false, edit:false, Excel:true})
                .navButtonAdd('#pager',{
                                caption:"Export to Excel", 
                                buttonicon:"ui-icon-save", 
                                onClickButton: function(){ 
                                  exportExcel();
                                }, 
                                position:"last"
                            });

        function exportExcel()
        {
            var mya=new Array();
            mya=$("#list").getDataIDs();  // Get All IDs
            var data=$("#list").getRowData(mya[0]);     // Get First row to get the labels
            var colNames=new Array(); 
            var ii=0;
            for (var i in data){colNames[ii++]=i;}    // capture col names
            var html="";
            for(i=0;i<mya.length;i++)
                {
                data=$("#list").getRowData(mya[i]); // get each row
                for(j=0;j<colNames.length;j++)
                    {
                    html=html+data[colNames[j]]+"\t"; // output each column as tab delimited
                    }
                html=html+"\n";  // output each row with end of line

                }
            html=html+"\n";  // end of line at the end
            document.forms[0].csvBuffer.value=html;
            document.forms[0].method='POST';
            document.forms[0].action='csvExport.php';  // send it to server which will open this contents in Excel file
            document.forms[0].target='_blank';
            document.forms[0].submit();
        }

Script PHP

header('Content-type: application/vnd.ms-Excel');
header("Content-Disposition: attachment; filename=file.xls");
header("Pragma: no-cache");

$buffer = $_POST['csvBuffer'];

try{
    echo $buffer;
}catch(Exception $e){

}
11
Felix

très bonne question, je me suis égratigné la tête à ce sujet également. Je l'ai choisi en choisissant la suggestion de Felix, laissez-moi la compléter en ajoutant les lignes suivantes à votre corps html.

<form method="post" action="csvExport.php">
    <input type="hidden" name="csvBuffer" id="csvBuffer" value="" />
</form>

Le seul problème que j'ai est le fichier Excel exporté n'inclut pas mes noms de colonne dans jqgrid, existe-t-il également un moyen d'exclure une ou plusieurs colonnes lors de l'exportation vers un fichier Excel?

merci ~ 

3
Patrick

Super fonction!
J'ai apporté des modifications.

 function exportExcel ($ id) {
 var clés = [], ii = 0, rows = ""; 
 var ids = $ id.getDataIDs (); // Obtenir tous les identifiants 
 Var row = $ id.getRowData (ids [0]); // Obtenir la première ligne pour obtenir les étiquettes 
 Pour (var k dans la ligne) {
 Clés [ii ++] = k; // capture les noms de col 
 rows = rows + k + "\ t"; // affiche chaque colonne en tant que délimité par des tabulations 
} 
 rows = rows + "\ n"; // En-tête de sortie avec fin de ligne 
 Pour (i = 0; i <ids.length; i ++) {
 Row = $ id.getRowData (ids [i]); // récupère chaque ligne 
 pour (j = 0; j <keys.length; j ++) lignes = lignes + ligne [clés [j]] + "\ t"; // affiche chaque ligne en tant que délimité par des tabulations 
 rows = rows + "\ n"; // affiche chaque ligne avec la fin de ligne 
} 
 rows = rows + "\ n"; // fin de ligne à la fin 
 var form = "<nom du formulaire = 'csvexportform' action = '" + php_path + "csvexport.php' method = 'post'>"; 
 form = form + "<type d'entrée = 'hidden' name = 'csvBuffer' valeur = '" + lignes + "'>"; 
 form = form + "</ form> <script> document.csvexportform.submit () ; </ sc "+" ript> "; 
 OpenWindow = window.open ('', ''); 
 OpenWindow.document.write (form); 
 OpenWindow. document.close (); 
} 
 
 function gridcsvexport (id) {
 $ ('#' + id) .jqGrid ('navButtonAdd', '# '+ id +' _ _ pager ', {
 libellé:' ', 
 titre:' export ', 
 icone du bouton:' ui-icon-newwin ', 
 position : 'last', 
 onClickButton: function () {
 exportExcel ($ (this)); 
} 
) [
} 
2
wagner

Voici une solution intelligente pour enregistrer les données jqGrid sous forme de feuille Excel sans appeler le script php: (Vous devez simplement appeler cette fonction avec GridID et une option Filename)

var createExcelFromGrid = function(gridID,filename) {
    var grid = $('#' + gridID);
    var rowIDList = grid.getDataIDs();
    var row = grid.getRowData(rowIDList[0]); 
    var colNames = [];
    var i = 0;
    for(var cName in row) {
        colNames[i++] = cName; // Capture Column Names
    }
    var html = "";
    for(var j=0;j<rowIDList.length;j++) {
        row = grid.getRowData(rowIDList[j]); // Get Each Row
        for(var i = 0 ; i<colNames.length ; i++ ) {
            html += row[colNames[i]] + ';'; // Create a CSV delimited with ;
        }
        html += '\n';
    }
    html += '\n';

    var a         = document.createElement('a');
    a.id = 'ExcelDL';
    a.href        = 'data:application/vnd.ms-Excel,' + html;
    a.download    = filename ? filename + ".xls" : 'DataList.xls';
    document.body.appendChild(a);
    a.click(); // Downloads the Excel document
    document.getElementById('ExcelDL').remove();
}

Nous créons d’abord une chaîne CSV délimitée par ;. Ensuite, une balise anchor est créée avec certains attributs. Finalement, click est appelé sur a pour télécharger le fichier.

Vous pouvez consulter plusieurs types Excel MIME: Liste des types MIME

1
Suhail Gupta

J'ai résolu votre problème. Et maintenant, je suis capable d'exporter des données Excel avec des noms de colonnes, veuillez vous référer à mon code.

function exportExcel()
    {
        var mya=new Array();
        mya=$("#tblnoupdate").getDataIDs();  // Get All IDs
        var data=$("#tblnoupdate").getRowData(mya[0]);     // Get First row to get the labels
        var colNames=new Array(); 
        var ii=0;
        for (var i in data){colNames[ii++]=i;}    // capture col names
        var html="";
            for(k=0;k<colNames.length;k++)
            {
            html=html+colNames[k]+"\t";     // output each Column as tab delimited
            }
            html=html+"\n";                    // Output header with end of line
        for(i=0;i<mya.length;i++)
            {
            data=$("#tblnoupdate").getRowData(mya[i]); // get each row
            for(j=0;j<colNames.length;j++)
                {
             html=html+data[colNames[j]]+"\t"; // output each Row as tab delimited
                }
            html=html+"\n";  // output each row with end of line

            }
        html=html+"\n";  // end of line at the end
        document.forms[0].csvBuffer.value=html;
        document.forms[0].method='POST';
        document.forms[0].action='<?php echo $baseurl;?>csvexport.php';  // send it to server which will open this contents in Excel file
        document.forms[0].target='_blank';
        document.forms[0].submit();
    }

S'il vous plaît laissez-moi savoir si vous rencontrez un problème.

1
Vijay

créez un formulaire et un élément masqué avec le nom "csvBuffer". Cet élément est défini par la fonction. Je devais changer de ligne

html = html+"\n"

à 

html = html+"\\n"

afin d'y échapper correctement.

0
Antonia