用于CodeIgniter的CSV导入库

Iva*_*ter 6 php csv xls helper codeigniter-2

需要将csv或xls导入到使用CodeIgniter创建的Application中.这有什么图书馆吗?任何建议表示赞赏.

Muh*_*eel 24

这是一个简单的方法.我不知道人们做了什么,但我用它

这是我的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;
    }   
}
?> 
Run Code Online (Sandbox Code Playgroud)

和控制器方法

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

        $data['csvData'] =  $result;
        $this->load->view('view_csv', $data);  
}
Run Code Online (Sandbox Code Playgroud)

这是观点

<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>
Run Code Online (Sandbox Code Playgroud)

参考这里


ajm*_*way 5

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

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

if (count($keys) == count($values)) {
Run Code Online (Sandbox Code Playgroud)

相反,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;
    }

}
?>
Run Code Online (Sandbox Code Playgroud)

控制器方法:

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

这是观点:

<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>
Run Code Online (Sandbox Code Playgroud)