web-dev-qa-db-ja.com

php + jqgrid +優れたエクスポート

誰かがjqgridからExcelにデータをエクスポートする方法を知っていますか?

このjqgridを使って、すごいと思うレポートをやりたいです。しかし、私はこのレポートを何らかの方法で保存または印刷する必要があります。これは、保持する情報だからです。誰かが何か知っていますか?

19
Paulo

これが私のアプローチです。このコードを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();
        }

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

非常に良い質問です。私もこれについて頭を悩ませていました。私はFelixの提案を選択して作成しました。HTML本文に次の行を追加して、完成させます。

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

私が抱えている唯一の問題は、エクスポートされたExcelファイルにjqgridの列名が含まれていないことです。また、Excelファイルにエクスポートするときに特定の列または複数の列を除外する方法はありますか?

ありがとう〜

3
Patrick

素晴らしい機能!
変更を加えました。

 function exportExcel($ id){
 var keys = []、ii = 0、rows = ""; 
 var ids = $ id.getDataIDs(); //すべてのIDを取得
 var row = $ id.getRowData(ids [0]); //最初の行を取得してラベルを取得します
 for(var k in row){
 keys [ii ++] = k; //列名をキャプチャします
 rows = rows + k + "\ t"; //各列をタブ区切りとして出力します
} 
 rows = rows + "\ n"; //行末のヘッダーを出力
 for(i = 0; i <ids.length; i ++){
 row = $ id.getRowData(ids [i]); //各行を取得
 for(j = 0; j <keys.length; j ++)rows = rows + row [keys [j]] + "\ t"; //各行をタブ区切りとして出力します
 rows = rows + "\ n"; //各行を行末で出力します
} 
 rows = rows + "\ n"; //行末の終わり
 var form = "<form name = 'csvexportform' action = '" + php_path + "csvexport.php' method = 'post'>"; 
 form = form + "<input type = 'hidden' name = 'csvBuffer' value = '" + rows + "'>"; 
 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 '、{
 caption:' '、
 title:' export '、
 buttonicon:' ui-icon-newwin '、
 position : 'last'、
 onClickButton:function(){
 exportExcel($(this)); 
} 
}); 
} 
2
wagner

jqGridスクリプトを呼び出さずにphpデータをExcelシートとして保存する賢い解決策は次のとおりです(この関数はGridIDとオプションの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();
}

まず、;で区切られたCSV文字列を作成します。次に、特定の属性を使用してanchorタグが作成されます。最後に、clickaで呼び出され、ファイルがダウンロードされます。

あなたはいくつかのExcelMIMEタイプを見ることができます: MIMEタイプリスト

1
Suhail Gupta

私はあなたの問題を解決しました。そして今、列名でデータExcelをエクスポートすることができます。私のコードを参照してください。

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();
    }

問題が発生した場合はお知らせください。

1
Vijay

「csvBuffer」という名前のフォームと非表示要素を作成します。この要素は関数によって設定されます。行を変更する必要がありました

html = html+"\n"

html = html+"\\n"

それをきちんと逃れるために。

0
Antonia