Yii提供的CGridView组件没有内置数据导出功能,不过我们可以通过扩展该组件来添加该功能。

具体方法如下:

1、首先派生一个子类,添加一个action成员,在该视图的init函数中判断是浏览动作还是数据导出动作,如果是浏览动作者则保持默认行为,否则输出csv文件。

  1. public function init()
  2. {
  3. if($this->action == 'export')
  4. {
  5. parent::init();
  6. $this->genCsv();
  7. }
  8. else
  9. {
  10. parent::init();
  11. }
  12. }

2、处理csv文件的输出:

  1. protected function genCsv()
  2. {
  3. header("Content-Type: text/csv; charset=GB2312");
  4. header('Content-Disposition: attachment; filename="'.$this->fileName.'"');
  5. //add your content dump codes here
  6. flush();
  7. }

3、然后在表格控件界面上添加一个csv导出按钮

覆盖其renderItems()方法如下:

  1. public function renderItems()
  2. {
  3. if(Yii::app()->user->checkAccess('administrator'))
  4. {
  5. echo '<div class="toolBar">';
  6. echo '<form action="'.CHtml::normalizeUrl(array($this->action)).'&id='.$this->id.'" method="post">';
  7. foreach($this->getController()->getActionParams() as $name => $value)
  8. {
  9. echo '<input type="hidden" name="'.addcslashes($name,'"').'" value="'.addcslashes($value,'"').'" />';
  10. }
  11. echo '<input type="image" title="'.Yii::t('ifCMS','Export to CSV').'" src="'.Yii::app()->theme->BaseUrl.'/images/ico-csv.png" alt="Submit">';
  12. echo '</form>';
  13. echo '</div>';
  14. }
  15. parent::renderItems();
  16. }

4、然后在点击CSV的动作处理比如actionCsv()中render单个表格视图,模板如下

  1. <?php
  2. $this->widget('application.extensions.grid.MyGridView', array(
  3. 'id'=>'grid',
  4. 'action'=>'export',
  5. 'dataProvider'=>$dp,
  6. 'columns'=>array(
  7. array(
  8. 'header'=>Yii::t('Statistics','Phone'),
  9. 'name'=>'phone',
  10. ),
  11. array(
  12. 'header'=>Yii::t('Statistics','Count'),
  13. 'name'=>'count',
  14. ),
  15. )
  16. ));?>

注意上述第2步csv输出函数中的header设置语句之前不要有任何的输出,包括如下函数:

  1. print, echo, printf, trigger_error, vprintf, ob_flush, var_dump, readfile, passthru

否则内容只会在浏览器中输出,但不会出现文件下载。

by iefreer

参考:

http://stackoverflow.com/questions/8028957/headers-already-sent-by-php

最新文章

  1. css实现分割线
  2. JAVA 编程规范(上)
  3. Intent启动一个新的页面
  4. How to locate a path? - Unix &amp; Linux Stack Exchange
  5. LLVM,Clang
  6. 剑指offer--面试题14--收获
  7. Delphi异形窗口之PNG
  8. Java更新XML的四种常用方法简介
  9. dijkstra算法(迪杰斯特拉算法)
  10. 作业.把c语言输出的基础差不多都概括了!
  11. Java多线程——线程同步
  12. Java设计模式---(动态)代理模式
  13. JavaWeb框架的基石
  14. 【JAVAWEB学习笔记】11_XML&amp;反射
  15. Spring学习笔记5——注解方式AOP
  16. 关于QT下资源使用和资源占用…
  17. 七、Json格式的对象都可以通过遍历来获得里面的value值
  18. html5 缓存实例
  19. console输出选择器的问题
  20. 【Scheme】元循环求值

热门文章

  1. Django models.py创建数据库
  2. NPM 与前端包管理
  3. webHttpBinding
  4. css样式margin padding border
  5. 使用OpenSSL(Windows x64版)将pem格式证书转换为p12格式
  6. 中南oj 1216: 异或最大值 数据结构
  7. POJ 2923(状态集合背包)
  8. js 两个小括号 ()() 的用法
  9. js-滚动到指定位置导航栏固定顶部
  10. UEditor 百度富文本编辑器 .Net实例