如何使用 JavaScript 将对象转换为 CSV?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22784802/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-27 23:45:48  来源:igfitidea点击:

How does one convert an object into CSV using JavaScript?

javascriptjqueryarrayscsv

提问by User1038

I want to convert this object into CSV file. The column names should be keys, this is small piece of array. And the last array will be only one of kind(keys), all other array will have same keys but different values.

我想将此对象转换为 CSV 文件。列名应该是键,这是一小块数组。最后一个数组将只是一种(键),所有其他数组将具有相同的键但不同的值。

[{
Comment: "Good",
Experince Months: "4",
Experince Years: "4",
Score: "3",
Subject: "CPP",
Topic: "Scripting (mention details)"
},
{
Comment: "Excilent",
Experince Months: "6",
Experince Years: "6",
Score: "6",
Subject: "CSharp",
Topic: "WPF"
},
{
Anything else worth highlighting: "Web Specialist",
Result: "Selected",
Total Business Analysis Experience: false,
Total Project Management Experience: false,
Total Score: 75,
Total Server Side Development Experience: true,
Total Server Side Support Experience: true,
Total UI Development Experience: true,
Total UI Support Experience: true
}]

回答by 6502

This is a simple implementation:

这是一个简单的实现:

// Returns a csv from an array of objects with
// values separated by tabs and rows separated by newlines
function CSV(array) {
    // Use first element to choose the keys and the order
    var keys = Object.keys(array[0]);

    // Build header
    var result = keys.join("\t") + "\n";

    // Add the rows
    array.forEach(function(obj){
        result += keys.map(k => obj[k]).join("\t") + "\n";
    });

    return result;
}

回答by Neeraj Singh

Anha!! actually I have a PHP Classwhich works pretty well with same json object key(you are using here diffrent json key in third set). So, if you like then you can modify my PHP Export Classas you want (for different object key). Here I am going to explain example and going to share my class with you too. Hope, after modify this class your wish come true :)

啊哈!!实际上我有一个PHP Class很好用的same json object key(你在这里使用第三组中的不同 json 键)。因此,如果您愿意,可以PHP Export Class根据需要修改 my (对于不同的对象键)。在这里,我将解释示例并与您分享我的课程。希望,修改这个类后你的愿望成真:)

PHP Export Class [Class.Export.php]

PHP Export Class [Class.Export.php]

<?php
/**
 * Class Export
 * 
 * Send JSON data and make an array to save as Excel file
 * 
 * @author neeraj.singh
 * @version 1.0
 *
 */

// Class Start Here
class Export {

    /**
     * Set Excel file name
     *
     * @var string
     */
    public $filename = 'excel-doc';

    /**
     * Set Excel field title
     *
     * @var string
     */
    public $custom_titles;

    /**
     * Get JSON data and convert in Excel file
     */
    public function saveAsExcel() {
        $CSV = trim ( $_POST ['exportdata'] );
        if (function_exists ( 'json_decode' )) {
            $data = json_decode ( $CSV, true );
            if (count ( $data ) > 0) {
                // call excel export
                $this->_createExcelByArray ( $data );
            } else {
                die ( "Sorry!! array not build." );
            }
        } else {
            die ( "Sorry!! json_decode not working on this server." );
        }
    }

    /**
     * Take an array and create
     * Excel file
     *
     * @param array $dataArray          
     */
    private function _createExcelByArray($dataArray) {
        // set excel file name
        $this->filename = 'DEMO-Excel' . '-' . date ( 'd-m-Y-H-s' );
        // get array field by first element of array
        foreach ( $dataArray [0] as $k => $v ) {
            $field [] = $k;
        }
        // get total no of field in array
        $totalFields = count ( $field );
        $i = $j = 0;
        // get array values
        foreach ( $dataArray as $v ) {
            for($j; $j < $totalFields; $j ++) {
                $value [$i] [] = $v [$field [$j]];
            }
            $i ++;
            $j = 0;
        }
        $this->initExcel ( $field, $value );
    }

    /**
     * Creating an Excel file with array data
     *
     * @param array $titles         
     * @param array $array          
     */
    public function initExcel($titles, $array) {
        $data = NULL;
        if (! is_array ( $array )) {
            die ( 'The data supplied is not a valid array' );
        } else {
            $headers = $this->titles ( $titles );
            if (is_array ( $array )) {
                foreach ( $array as $row ) {
                    $line = '';
                    foreach ( $row as $value ) {
                        if (! isset ( $value ) or $value == '') {
                            $value = "\t";
                        } else {
                            $value = str_replace ( '"', '""', $value );
                            $value = '"' . $value . '"' . "\t";
                        }
                        $line .= $value;
                    }
                    $data .= iconv ( "UTF-8", "GB18030//IGNORE", trim ( $line ) ) . "\n";
                }
                $data = str_replace ( "\r", "", $data );
                $this->generate ( $headers, $data );
            }
        }
    }

    /**
     * Create excel header and
     * write data into file
     *
     * @param string $headers           
     * @param string $data          
     */
    private function generate($headers, $data) {
        $this->set_headers ();
        echo "$headers\n$data";
    }

    /**
     * Set Excel file field header
     *
     * @param array $titles         
     * @return string
     */
    public function titles($titles) {
        if (is_array ( $titles )) {
            $headers = array ();
            if (is_null ( $this->custom_titles )) {
                if (is_array ( $titles )) {
                    foreach ( $titles as $title ) {
                        $headers [] = iconv ( "UTF-8", "GB18030//IGNORE", $title );
                    }
                } else {
                    foreach ( $titles as $title ) {
                        $headers [] = iconv ( "UTF-8", "GB18030//IGNORE", $title->name );
                    }
                }
            } else {
                $keys = array ();
                foreach ( $titles as $title ) {
                    $keys [] = iconv ( "UTF-8", "GB18030//IGNORE", $title->name );
                }
                foreach ( $keys as $key ) {
                    $headers [] = iconv ( "UTF-8", "GB18030//IGNORE", $this->custom_titles [array_search ( $key, $keys )] );
                }
            }
            return implode ( "\t", $headers );
        }
    }

    /**
     * Set Response Header
     */
    private function set_headers() {
        $ua = $_SERVER ["HTTP_USER_AGENT"];
        $filename = $this->filename . ".xls";
        $encoded_filename = urlencode ( $filename );
        $encoded_filename = str_replace ( "+", "%20", $encoded_filename );
        header ( "Pragma: public" );
        header ( "Expires: 0" );
        header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
        header ( "Content-Type: application/vnd.ms-excel; charset=UTF-8" );
        header ( "Content-Type: application/force-download" );
        header ( "Content-Type: application/octet-stream" );
        header ( "Content-Type: application/download" );
        if (preg_match ( "/MSIE/", $ua )) {
            header ( 'Content-Disposition: attachment; filename="' . $encoded_filename . '"' );
        } else if (preg_match ( "/Firefox/", $ua )) {
            header ( 'Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"' );
        } else {
            header ( 'Content-Disposition: attachment; filename="' . $filename . '"' );
        }
        header ( "Content-Transfer-Encoding: binary" );
    }
}
// Class End Here

Okay, here is HTMLand PHP Codeto demonstrate how it works.

好的,这是HTMLPHP Code演示它是如何工作的。

HTML Code:

HTML Code:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSON to Excel POC</title>    
    <script type="text/javascript">
    <!--    
    function excelExport() {
        // this is your json data as string or you can
        // use as object too
        var jsonObject = '[{ "Comment" : "Good", "ExperinceMonths" : "4", "ExperinceYears" : "4", "Score" : "3", "Subject" : "CPP", "Topic" : "Scripting (mention details)" }, { "Comment" : "Excilent", "ExperinceMonths" : "6", "ExperinceYears" : "6", "Score" : "6", "Subject" : "CSharp", "Topic" : "WPF" }]';     
        // create a form
        var form            = document.createElement('FORM');
        form.name           = 'exportform';
        form.id             = 'exportform';
        form.method         = 'POST';
        form.action         = './export.php';
        // create a hidden input inside form
        var hiddenInput         = document.createElement('INPUT');
        hiddenInput.type    = 'HIDDEN';
        hiddenInput.name    = 'exportdata';
        hiddenInput.id      = 'exportdata';
        hiddenInput.value   = jsonObject;
        // insert hidden element inside form
        form.appendChild(hiddenInput);
        // insert form inside body
        document.body.appendChild(form);
        // submit the form
        form.submit();
        // remoce the form
        document.body.removeChild(form);
        return true;
    }
    //-->
    </script>
    </head>
<body>
    <input type="button" value="Export" onClick='excelExport(); return false;'>
</body>
</html>

and finally Here is

最后这里是

PHP Code [export.php]

PHP Code [export.php]

<?php
// add Class Export File
require_once 'Class.Export.php';
// make a new onject of Class Export
$export = new Export ();
// Send POSt data to make
// Excel File
if(isset($_POST['exportdata'])){
    $export->saveAsExcel();
}
?>

Hope, this chunk of code will help people Because, Sharing is always Caring :) Cheers!!

希望,这块代码能帮助人们因为,分享永远是关怀:) 干杯!!