thinkPHP导出csv文件及用表格输出excel的方法


Posted in PHP onDecember 30, 2015

本文实例讲述了thinkPHP导出csv文件及用表格输出excel的方法。分享给大家供大家参考,具体如下:

1.thinkphp导出csv文件

导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this->display(),最后细心看到think_page_trace这样的字样,恍然大悟,是页面的跟踪日志,这个默认是会输出来的。最后在方法后面加了一个exit结束就好了,下面是代码:

1.IndexController.class.php

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
 public function index(){
  $hotel = M('keywords')->field('PageName,Page')->select();
  $str = "关键字,名称\n";
  $str = iconv('utf-8','gb2312',$str);
  $result = mysql_query("select PageName,Page from hotel_keywords");
  while($row=mysql_fetch_array($result)){
   $PageName = iconv('utf-8','gb2312',$row['PageName']);
   $Page = iconv('utf-8','gb2312',$row['Page']);
   $str .= $PageName.",".$Page."\n";
  }
  $fileName = date('Ymd').'.csv';
  $model = D('Keywords');
  $model->export_csv($fileName,$str);
  exit;
 }
}

2.KeywordsModel.class.php

<?php 
namespace Home\Model;
use Think\Model;
class KeywordsModel extends Model{
 public function export_csv($filename, $data){
  header("Content-type:text/csv"); 
  header("Content-Disposition:attachment;filename=".$filename); 
  header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); 
  header('Expires:0'); 
  header('Pragma:public');
  echo $data;
  
 }
}

奥妙就在IndexController.class.php代码最后一句的exit这里,如果不写这句,输出的excel里面有html源码,截图如下:

thinkPHP导出csv文件及用表格输出excel的方法

2.用表格输出excel

如下代码purchase_prospects.php

<?php
require('page_header.php');
$site_id = getIfSet($_GET, 'site_id', 0);
$customer_type = getIfSet($_GET, 'customer_type',0);
$DB = Database::connect($site_id);
if($site_id>0 && $customer_type>0){
 $sql = '';
 $out = ''; 
 $short_name_array = SiteSettings::$SITE_SHORT_NAME;
 $short_name = $short_name_array[$site_id]; 
 switch ($customer_type) {
  case '1':{
   $sql = "SELECT 
      email, CONCAT(UCASE(LEFT(firstname, 1)),SUBSTRING(firstname, 2)) AS firstname, CONCAT(UCASE(LEFT(lastname, 1)),SUBSTRING(lastname, 2)) AS lastname 
     FROM customers 
     WHERE site_id =$site_id 
      AND email NOT REGEXP '.+(avanquest)|(planetart)|(novadevelop)|(qatest).+' 
      AND email IN(SELECT a.email FROM customers a INNER JOIN orders b ON a.id=b.`customer_id` AND b.is_test=0 AND a.site_id =$site_id) 
      AND email NOT IN (SELECT email_address FROM `newsletter_unsubscribes` WHERE site_id =$site_id);";
   $res = $DB->query($sql);
   $out = '<table class="data_table"><tr><th>email</th><th>firstname</th><th>lastname</th></tr>';
   while($row = mysql_fetch_array($res)){
    $out .= '<tr><td>'.$row['email'].'</td><td>'.$row['firstname'].'</td><td>'.$row['lastname'].'</td></tr>';
   }
   $short_name .= '_purchased';
   break;
  }
  case '2':{
   $DB->query("DROP TEMPORARY TABLE IF EXISTS tmp_purchase;");
   $DB->query("CREATE TEMPORARY TABLE tmp_purchase SELECT a.email FROM customers a INNER JOIN orders b ON a.id=b.`customer_id` AND b.is_test=0 AND a.site_id =$site_id; ");
   $DB->query("DROP TEMPORARY TABLE IF EXISTS tmp_nopurchase;");
   $DB->query("CREATE TEMPORARY TABLE tmp_nopurchase SELECT email FROM customers WHERE site_id =$site_id AND email NOT IN(SELECT email FROM tmp_purchase);");
   if(9 != $site_id){
    $datatype = SiteSettings::getPurchaseDataType($site_id);
    $DB->query("INSERT tmp_nopurchase SELECT DISTINCT email FROM triggered_email_data WHERE datatype='$datatype' AND email NOT IN(SELECT email FROM tmp_purchase);");
   }
   $sql = "SELECT DISTINCT email FROM tmp_nopurchase WHERE email NOT REGEXP '.+(avanquest)|(planetart)|(novadevelop)|(qatest).+' AND Email REGEXP '[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$' AND email NOT IN (SELECT email_address FROM `newsletter_unsubscribes` WHERE site_id =$site_id);";
   $res = $DB->query($sql);
   $out = '<table class="data_table"><tr><th>email</th></tr>';
   while($row = mysql_fetch_array($res)){
    $out .= '<tr><td>'.$row['email'].'</td></tr>';
   }
   $short_name .= '_non-purchased and signup';
   break;
  }
  default:
   break;
 }
 $out .= '</table>';
 header("Content-type:application/vnd.ms-excel");
 header("Content-Disposition:filename=$short_name.xls");
 echo $out;
 exit;
}
?>
<h1>Purchase Prospects Report</h1>
<form name="frm" method="get" action="purchase_prospects.php">
<strong>Select Site:</strong> 
<select name="site_id" id="site_id">
 <option value="0">== select site ==</option>
 <option value="1">STI</option>
 <option value="2">PA</option>
 <option value="3">CW</option>
 <option value="6">MCC</option>
 <option value="9">CB</option>
 <option value="4">STIUK</option>
 <option value="8">MCCUK</option>
</select>   
   
<strong>Select Type:</strong>
<select id="customer_type" name="customer_type">
 <option value="0">== select type ==</option>
 <option value="1">purchased</option>
 <option value="2">non-purchased and signup</option>
</select>
  
   
<input id="submit" type="submit" value="Run »">
</form>
<script type="text/javascript">
 $(function(){
  $("#submit").click(function(){
   if('0' == $("#site_id").val() || '0' == $("#customer_type").val()){
    alert('please select Site and Site');
    return false;
   }
  })
 });
</script>

这样也可以导出ecxcel文件,截图如下

thinkPHP导出csv文件及用表格输出excel的方法

依然注意最后一句exit;如果没有这一句,excel里面会有一些页面元素。

希望本文所述对大家基于thinkPHP框架的php程序设计有所帮助。

PHP 相关文章推荐
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
8个必备的PHP功能实例代码
Oct 27 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
Jul 25 PHP
PHP排序算法类实例
Jun 17 PHP
10条php编程小技巧
Jul 07 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
laravel5使用freetds连接sql server的方法
Dec 07 PHP
PHP 8新特性简介
Aug 18 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 17 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 #PHP
分享PHP守护进程类
Dec 30 #PHP
如何写php守护进程(Daemon)
Dec 30 #PHP
PHP汉字转换拼音的函数代码
Dec 30 #PHP
使用PHP如何实现高效安全的ftp服务器(二)
Dec 30 #PHP
php获取当前页面完整URL地址
Dec 30 #PHP
详解WordPress中添加和执行动作的函数使用方法
Dec 29 #PHP
You might like
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
php抓取页面与代码解析 推荐
2010/07/23 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
Python callable内置函数原理解析
2020/03/05 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
国外的一些J2EE面试题一
2012/10/13 面试题
教你打造完美的创业计划书
2014/01/06 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
运动会200米广播稿
2015/08/19 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
Pytorch可视化的几种实现方法
2021/06/10 Python
Python List remove()实例用法详解
2021/08/02 Python
python之json文件转xml文件案例讲解
2021/08/07 Python
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers