7

需要将 csv 或 xls 导入到使用 CodeIgniter 创建的应用程序中。有没有这方面的图书馆?任何建议表示赞赏。

4

5 回答 5

26

这是一个简单的方法来做到这一点。我不知道人们做什么,但我用这个

这是我的 csv 阅读器库

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class CSVReader {

    var $fields;            /** columns names retrieved after parsing */ 
    var $separator = ';';    /** separator used to explode each line */
    var $enclosure = '"';    /** enclosure used to decorate each field */

    var $max_row_size = 4096;    /** maximum row size to be used for decoding */

    function parse_file($p_Filepath) {

        $file = fopen($p_Filepath, 'r');
        $this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure);
        $keys_values = explode(',',$this->fields[0]);

        $content    =   array();
        $keys   =   $this->escape_string($keys_values);

        $i  =   1;
        while( ($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false ) {            
            if( $row != null ) { // skip empty lines
                $values =   explode(',',$row[0]);
                if(count($keys) == count($values)){
                    $arr    =   array();
                    $new_values =   array();
                    $new_values =   $this->escape_string($values);
                    for($j=0;$j<count($keys);$j++){
                        if($keys[$j] != ""){
                            $arr[$keys[$j]] =   $new_values[$j];
                        }
                    }

                    $content[$i]=   $arr;
                    $i++;
                }
            }
        }
        fclose($file);
        return $content;
    }

    function escape_string($data){
        $result =   array();
        foreach($data as $row){
            $result[]   =   str_replace('"', '',$row);
        }
        return $result;
    }   
}
?> 

和控制器方法

function readExcel()
{
        $this->load->library('csvreader');
        $result =   $this->csvreader->parse_file('Test.csv');

        $data['csvData'] =  $result;
        $this->load->view('view_csv', $data);  
}

这是视图

<table cellpadding="0" cellspacing="0" width="100%">
    <tr>
            <td width = "10%">ID</td>
            <td width = "20%">NAME</td>
            <td width = "20%">SHORT DESCRIPTION</td>
            <td width = "30%">LONG DESCRIPTION</td>
            <td width = "10%">STATUS</td>
            <td width = "10%">PARENTID</td>
    </tr>

            <?php foreach($csvData as $field){?>
                <tr>
                    <td><?php echo $field['id']?></td>
                    <td><?php echo $field['name']?></td>
                    <td><?php echo $field['shortdesc']?></td>
                    <td><?php echo $field['longdesc']?></td>
                    <td><?php echo $field['status']?></td>
                    <td><?php echo $field['parentid']?></td>
                </tr>
            <?php }?>
</table>

参考这里

于 2013-03-16T13:09:43.953 回答
5

这是 raheel shan 接受的答案的改进版本 - 我编辑了他的答案,但我的编辑被拒绝了,但这是一个重要的变化......

在解析每个数据行时,在逗号上使用是不明智的,explode()因为它不处理包含逗号的引号包裹的字符串。Explode 将这些字符串分解为子字符串并在 中提供额外的数组元素$values,因此此检查失败:

if (count($keys) == count($values)) {

相反,PHP 有一个专门构建的方法来处理这个问题;str_getcsv()。我已经相应地更新了原始答案代码。

CSV 阅读器库:

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class CSVReader {

    var $fields;/** columns names retrieved after parsing */
    var $separator = ';';/** separator used to explode each line */
    var $enclosure = '"';/** enclosure used to decorate each field */
    var $max_row_size = 4096;/** maximum row size to be used for decoding */

    function parse_file($p_Filepath) {

        $file = fopen($p_Filepath, 'r');
        $this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure);
        $keys = str_getcsv($this->fields[0]);

        $i = 1;
        while (($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false) {
            if ($row != null) { // skip empty lines
                $values = str_getcsv($row[0]);
                if (count($keys) == count($values)) {
                    $arr = array();
                    for ($j = 0; $j < count($keys); $j++) {
                        if ($keys[$j] != "") {
                            $arr[$keys[$j]] = $values[$j];
                        }
                    }

                    $content[$i] = $arr;
                    $i++;
                }
            }
        }
        fclose($file);
        return $content;
    }

}
?>

控制器方法:

function readExcel() {
    $this->load->library('csvreader');
    $result = $this->csvreader->parse_file('Test.csv');
    $data['csvData'] = $result;
    $this->load->view('view_csv', $data);
}

这是观点:

<table cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td width="10%">ID</td>
        <td width="20%">NAME</td>
        <td width="20%">SHORT DESCRIPTION</td>
        <td width="30%">LONG DESCRIPTION</td>
        <td width="10%">STATUS</td>
        <td width="10%">PARENTID</td>
    </tr>
    <?php foreach ($csvData as $field) { ?>
        <tr>
            <td><?php echo $field['id'] ?></td>
            <td><?php echo $field['name'] ?></td>
            <td><?php echo $field['shortdesc'] ?></td>
            <td><?php echo $field['longdesc'] ?></td>
            <td><?php echo $field['status'] ?></td>
            <td><?php echo $field['parentid'] ?></td>
        </tr>
    <?php } ?>
</table>
于 2015-09-26T13:24:20.813 回答
2

好吧,别介意我,我只是修改了ajmedway的库以包含分隔符,以防万一您想从TSV或管道分隔文件中获取数据。如果您想要普通的旧 CSV,他就可以了。

class CSVReader {

var $fields;/** columns names retrieved after parsing */
var $separator = ';';/** separator used to explode each line */
var $enclosure = '"';/** enclosure used to decorate each field */
var $max_row_size = 4096;/** maximum row size to be used for decoding */

function parse_file($p_Filepath, $delimiter = FALSE ) {

    $file = fopen($p_Filepath, 'r');
    $this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure);
    if ($delimiter==FALSE)
    {
    $keys = str_getcsv($this->fields[0]);

    $i = 1;
    while (($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false) {
        if ($row != null) { // skip empty lines
            $values = str_getcsv($row[0]);
            if (count($keys) == count($values)) {
                $arr = array();
                for ($j = 0; $j < count($keys); $j++) {
                    if ($keys[$j] != "") {
                        $arr[$keys[$j]] = $values[$j];
                    }
                }

                $content[$i] = $arr;
                $i++;
            }
        }
    }
    }
    else{
        $keys = str_getcsv($this->fields[0],$delimiter);

        $i = 1;
        while (($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false) {
            if ($row != null) { // skip empty lines
                $values = str_getcsv($row[0],$delimiter);
                if (count($keys) == count($values)) {
                    $arr = array();
                    for ($j = 0; $j < count($keys); $j++) {
                        if ($keys[$j] != "") {
                            $arr[$keys[$j]] = $values[$j];
                        }
                    }

                    $content[$i] = $arr;
                    $i++;
                }
            }
        }
    }

    fclose($file);
    return $content;
}}?>
于 2016-06-09T21:14:50.773 回答
0

这是空行和额外空格和制表符的改进版本...

class CSVReader {

    function csv_to_array($Filepath)
    {
        //Get csv file content
        $csvData = file_get_contents($Filepath);
        
        //Remove empty lines
        $csvData = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\r\n", $csvData);
       
        //String convert in array formate and remove double quote(")
        $array = array();
        $array = $this->escape_string(preg_split('/\r\n|\r|\n/', $csvData));
        $new_content_in_array = array();
        if($array)
        {
            //Get array key
            $array_keys = array();
            $array_keys = array_filter(array_map('trim', explode(';',$array[0])));
            
            //Get array value
            $array_values = array();
            for ($i=1;$i<count($array);$i++)
            {
                if($array[$i])
                {
                    $array_values[] = array_filter(array_map('trim', explode(';',$array[$i])));
                }
            }
            
            //Convert in associative array
            if($array_keys && $array_values)
            {
                $assoc_array = array();
                foreach ($array_values as $ky => $val)
                {           
                    for($j=0;$j<count($array_keys);$j++){
                        if($array_keys[$j] != "" && $val[$j] != "" && (count($array_keys) == count($val)))
                        {
                            $assoc_array[$array_keys[$j]] = $val[$j];
                        }
                    }
                    $new_content_in_array[] = $assoc_array;
                }
            }
        }
        return $new_content_in_array;
    }
    
    function escape_string($data){
        $result =   array();
        foreach($data as $row){
            $result[]   = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "", str_replace('"', '',$row));
        }
        return $result;
    }   
}
于 2016-08-08T12:31:27.773 回答
-1

调用控制器:

$this->load->library('csvreader');
$import_csv_data = $this->csvreader->csv_to_array($path);
print_r($import_csv_data );
exit;
于 2016-08-08T12:34:53.807 回答