在Yii框架中显示CSV文件内容';s CGridView

在Yii框架中显示CSV文件内容';s CGridView,yii,Yii,我试图在CGridView中显示CSV文件内容,我想将CSV文件头显示为CGridView“列”,将其内容显示为DataProvider。请提供实现此目的的任何想法?您可以使用CArrayDataProvider。 你可以这样做 $file = fopen('test.csv', 'r'); $data = array(); while (($line = fgetcsv($file)) !== FALSE) { //$line is an array of the csv eleme

我试图在CGridView中显示CSV文件内容,我想将CSV文件头显示为CGridView“列”,将其内容显示为DataProvider。请提供实现此目的的任何想法?

您可以使用CArrayDataProvider。

你可以这样做

$file = fopen('test.csv', 'r');
$data = array();
while (($line = fgetcsv($file)) !== FALSE) {
    //$line is an array of the csv elements
    $data[] = $line;
}
fclose($file);
$columns = array();
foreach ($data[0] as $key => $value) {
    $columns[] = array(
        'name' => $key,
        'header' => $value,
    );
}
$data = array_slice($data, 1);
$dataProvider = new CArrayDataProvider($data, array(
    'keyField' => 0,
));
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
    'columns' => $columns
));
$dataProvider = new CsvDataProvider('file.csv');
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
    'columns' => $dataProvider->getColumns(),
));
如果要为CSV创建通用数据提供程序,可以创建一个新类

class CsvDataProvider extends CArrayDataProvider {

    private $_columns = array();

    public function __construct($file, $config = array()) {
        $handler = fopen($file, 'r');
        $data = array();
        while (($line = fgetcsv($handler)) !== FALSE) {
            $data[] = $line;
        }
        fclose($handler);
        $this->_columns = array();
        foreach ($data[0] as $key => $value) {
            $this->_columns[] = array(
                'name' => $key,
                'header' => $value,
            );
        }
        $data = array_slice($data, 1);
        parent::__construct($data, array_merge($config, array(
            'keyField' => 0,
        )));
    }

    public function getColumns() {
        return $this->_columns;
    }
}
然后你可以做这样的事情

$file = fopen('test.csv', 'r');
$data = array();
while (($line = fgetcsv($file)) !== FALSE) {
    //$line is an array of the csv elements
    $data[] = $line;
}
fclose($file);
$columns = array();
foreach ($data[0] as $key => $value) {
    $columns[] = array(
        'name' => $key,
        'header' => $value,
    );
}
$data = array_slice($data, 1);
$dataProvider = new CArrayDataProvider($data, array(
    'keyField' => 0,
));
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
    'columns' => $columns
));
$dataProvider = new CsvDataProvider('file.csv');
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
    'columns' => $dataProvider->getColumns(),
));

我已经使用了上面的代码,现在得到了这个错误“为foreach()提供的参数无效”,我还没有真正尝试上面的代码。我忘记了
fgetcsv()
将逐行返回。如果您使用的是PHP5.3,那么可以使用
str\u getcsv()
函数。或者这一次,我还没有尝试使用gridview排序。如果在gridview中使用排序时出现一些问题,请告诉我。我认为如果你试图显示一个非常大的CSV文件,会有一些性能问题。这是因为即使有分页,您仍然必须将整个CSV文件加载到内存中。Yii论坛对此进行了讨论。谢谢,我会查看链接的