ThinkPHP中用PHPExcel导出excel文件数据例子

作者:袖梨 2022-06-24
下面给出步骤:

1.准备:自己制作一个生成的excel参考的模板文件,template.xls,我的模板为

在这个模板里面,你想在哪个位置显示什么样式就设置什么样式,到时候相对应位置 查出来的数据就会自动套用样式,比如说标题大小,背景颜色,用函数等,都会自动套用,就不用在后台代码控制那么麻烦了,这个也是选择用模板生成excel原因。
附:
1.某列用条件格式等高级一点的操作应该也是可以的,没有试。

2.大家要注意一点,我要输出的数据是从第4行开始填充的,但是最好留出一行空的,比如说第5行,并不仅仅为了查出来的数据和统计总数分开好看,也是为了方便在模板里面设置函数,比如说上面的D6,用了SUM(D4:D5)函数,我是想统计D这一列的数据,但是在D6函数不能仅仅是=SUM(D4)吧,等生成数据的时候就到达不了效果,查出来的数据就是统计D4这个了,所以记得留出一行

2.下载PHPExcel文件,网上一百度就出来了,下载下来解压后目录结构如下:(附件中也提供有下载,附件中的PHPExcel是经过我的压缩,把多余的东西删除了的)

psb (3)

结构目录的说明,

1.下载下来的文件夹有3个文件夹和3个txt的说明文档(说明文档就不说了):

Classes文件夹:这个文件夹是PHPExcel的主要包,也就是说只要把这个文件夹拷贝到项目,引用就可以了。这个文件夹下面有PHPExcel.php文件和PHPExcel文件夹,引用的时候用PHPEx.php就可以了。
Documentation文件夹:说明文档,略过。
Tests文件夹:这个文件夹虽然不用导入到项目,但是里面满满的都是例子啊,都是给我们用的。我测试用的就是里面01simple-download-xls.php和30template.php这两个例子的代码结合在一起,分别是下载xls和加载模板的。
3.新建一个项目,导入ThinkPHP,配置好index.php,配置文件,在Public文件夹下面放我们的excel.模板文件。特别的,在ThinkPHP下面的Extend文件夹下新建文件夹Vendor,把PHPExcel复制到其根目录下。因为ThinkPHP中用PHPExcel不能通过

require  './include/phpexcel/Classes/PHPExcel.php';这样加载,只能是用Vendor()加载第三方类库方式加进去。(这个很重要,我之前一直不成功原因就是在这里)

psb (2)

5.我的项目目录如下:

psb (3)psb (4)

6.在IndexAction中的index()内写如下方法

 

 代码如下 复制代码
class IndexAction extends Action {
  /**导出的excel表格 */
  function index() {
    //将需要导出到excel的数据查询出来
    $mdata = M ( 'a' );
    $data = $mdata->select ();
  
    //开始生成excel内容
    /** 加载IOFactory包 */
    Vendor ( 'Excel.Classes.PHPExcel' ); //Vendor路径的写法参考ThinkPHP文档
  
    /** 错误信息 */
    error_reporting ( E_ALL );
  
    $objReader = PHPExcel_IOFactory::createReader ( 'Excel5' ); //在内存中建一个excel2003操作
    //加载需要读取的模板放在内存的excel中,路径一定要对啊,我在index.php中用了define(ROOT, dirname(__FILE__));所以下面这样写
    $objPHPExcel = $objReader->load ( ROOT . "/Pulice/template/template.xls" );
  
    //设置excel格式
    //$objPHPExcel->getActiveSheet ()->setCellValue ( 'B1', '统计表' ); //在B位置显示标题,可以动态添加,这个例子中我是在母版中写死了的
    $objPHPExcel->getActiveSheet ()->setCellValue ( 'E1', date ( 'Y-m-d H:i:s', time () ) ); //在E位置显示时间
  
    /**将数据用循环放进表格相对应位置S*/
    $baseRow = 5; //数据从5-1行开始往下输出,具体数据看你的模板了
  
    foreach ( $data as $r => $dataRow ) {
      $row = $baseRow + $r;
      $objPHPExcel->getActiveSheet ()->insertNewRowBefore ( $row, 1 ); //插入新的行
   
      //将数据填充到相对应的位置
      $objPHPExcel->getActiveSheet ()->setCellValue ( 'A' . $row, $r + 1 ); //序号
      $objPHPExcel->getActiveSheet ()->setCellValue ( 'B' . $row, $dataRow ['codenum'] ); //编号
      $objPHPExcel->getActiveSheet ()->setCellValue ( 'C' . $row, $dataRow ['name'] ); //物品名称
      $objPHPExcel->getActiveSheet ()->setCellValue ( 'D' . $row, $dataRow ['price'] ); //单价
      $objPHPExcel->getActiveSheet ()->setCellValue ( 'E' . $row, $dataRow ['quantity'] ); //数量
    }
    $objPHPExcel->getActiveSheet ()->removeRow ( $baseRow - 1, 1 ); //作用:把最顶上面的那一空白行去掉
    //---------上面的代码是从30template.php(加载模板)中copy下来自己改成我想要————————————————
  
    //  ----------下面的代码是从01simple-download-xls.php(下载excel表格)中copy下来的-------
    //将得到的数据导出到excel中提供给用户下载
  
    // 将输出重新定向到客户端浏览器的(Excel5)
    $filename = date ( 'Y-m-d', time () );
    header ( 'Content-Type: application/vnd.ms-excel' );
    header ( 'Content-Disposition: attachment;filename="' . $filename . '.xls"' ); //要下载的excel文件的文件名,这设置了用当前时间作为文件名
    header ( 'Cache-Control: max-age=0' );
  
    $objWriter = PHPExcel_IOFactory::createWriter ( $objPHPExcel, 'Excel5' ); //在内存中准备一个excel2003文件
    $objWriter->save ( 'php://output' );
    exit ();
  }
}

7.在模板页调用上面的方法就可以了,比如导出excel

当然啦,想根据条件来导出内容就看你怎么查数据库咯。


写最后:当然啦,我是做好了才截图上来的,所以还没有完善,还要处理一下问题滴,比如说乱码 啊(看你下载下来的有没有乱码咯)。

相关文章

精彩推荐