一、动态生成的内容如何能当成文件来下载呢?

方法:1.将Content-Type设置成application/octet-stream就可以了,即【header('Content-Type: application/octet-stream'); 】

   2.用Content-Disposition设置下载的文件名,即【header('Content-Disposition: attachment; filename=' . $filename);】

a.基本上的下载程序都是这么写的:

 <?php
$filename = "document.txt";
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>

b.平时我们也要考虑到浏览器的兼容性和中文文件名乱码的问题:

 <?php
//获取user agent
$ua = $_SERVER["HTTP_USER_AGENT"];
$filename = "文件名.txt";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename); header('Content-Type: application/octet-stream'); //判断是否为IE浏览器(IE10以下可以用MSIE判断,以上不行)
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
} else { //其他
header('Content-Disposition: attachment; filename="' . $filename . '"');
} print 'ABC';
?>

二、原始一点的方法:发送header,用附件的表头发送到用户浏览器表示是要下载的,然后读出数据库中的数据,一条一条的解析,写入excel格式的文件中

 <?php
/**
*\n软换行
*\r软空格
*\t挑格(跳到下一列)
*/
// 连接数据库
$db = @mysql_connect('localhost','root','root'); if(!$db){
die('Could not connect: ' . mysql_error());
} //设置字符集
mysql_query("set names utf8");
//打开数据库
mysql_select_db("database"); $sql = "SELECT * FROM table_name LIMIT 100";
$result = mysql_query($sql); header('Content-Type: application/octet-stream');//下载
header("Content-Disposition: attachment; filename=sql.xls");//文件
header("Pragma: no-cache"); //不缓存 $title = '数据库:vvt,数据表:vvt_user,备份日期:'.date('Y/m/d/H/i/s');
//输出标题并换行(一个'\n'代表一行)
echo $title."\n"; //mysql_num_fields返回结果集中字段的数量
$columns_num = mysql_num_fields($result); //mysql_field_name返回结果集中的字段名,
for($i=0;$i<$columns_num;$i++){
//输出字段名称(表头)
echo mysql_field_name($result,$i). "\t";
} //将字段输出到一行后,下面就是拼接显示每一行字段对应的value
print("\n"); //添加内容(\t是跳列,跳到下一列)
$tab = "\t";
//mysql_num_rows返回结果集行数
if($result && mysql_num_rows($result)){
//得到关联数组mysql_fetch_assoc,mysql_fetch_row得到索引数组先循环数据
while($rows = mysql_fetch_row($result)){
// var_dump($rows);die;
$table_data = "";
//循环字段数,将每条数据对应的字段值填入对应的地方
for($j=0;$j<$columns_num;$j++){
if(!isset($rows[$j])){
//没值就使用'NULL'占位,并拼接"\t"跳到下一格
$table_data .= 'NULL'.$tab;
}elseif($rows[$j]){
$table_data .= "{$rows[$j]}".$tab;
}else{
$table_data .= "".$tab;
}
} $table_data = str_replace($tab.'$',"",$table_data);
// $table_data .= "\t";
print(trim($table_data));
print("\n");
$i++;
}
} //关闭mysql连接
mysql_close($con);
?>

三、PHPExcel库

  可以到官网去下载:http://phpexcel.codeplex.com/,解压后里面有三个目录

  Classes:此文件夹中是PHPExcel核心类库文件,我们对excel报表的处理都是通过此文件夹中的类文件来完成的,注意:所有的类名都是以PHPExcel_*开头的

  Documentation:这个文件夹中存放的是PHPExcel类库的英文说明文档

  Examples:是一些小的测试案例,这些小案例对于我们入门是非常有帮助的

  拓展:当输出数字字符串到excel文件中时,可在数字字符串前面拼接一个空格即可(或者指定单元格的数据类型为文本类型)

 <?php
//引入PHPExcel文件和Excel2007文件(用于输出.xls的)、Excel5(用于低版本的xls)
require_once './PHPExcel/Classes/PHPExcel.php';
require_once './PHPExcel/Classes/PHPExcel/Writer/Excel2007.php';
require_once './PHPExcel/Classes/PHPExcel/Writer/Excel5.php'; //实例化PHPExcel对象
$objExcel = new PHPExcel();
$objWriter = new PHPExcel_Writer_Excel2007($objExcel);
// $objWriter = new PHPExcel_Writer_Excel5($objExcel);非2007格式 //设置一个活动表(第一个工作表为活动表)
$objExcel->setActiveSheetIndex(0);
/*********************************************部分功能说明 start*********************************************/
//设置单元格内容setCellValue(设置单元格的值)、setCellValueExplicit(设置单元格的值,并显示的指定数据的类型)
$objExcel->getActiveSheet()->setCellValueExplicit('A1','名字',PHPExcel_Cell_DataType::TYPE_STRING);
17 $objExcel->getActiveSheet()->setCellValue('A1','名字'); //文字水平居中setHorizontal
$objExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal($option);
//文字垂直居中setVertical
$objExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical($option);
// 合并
$objExcel->getActiveSheet()->mergeCells('A1:B1');
// 拆分
$objExcel->getActiveSheet()->unmergeCells('A1:B1');
//设置单元格列setWidth(宽度)、setAutoSize(列的宽度刚好为字体内容的宽度)
$objExcel->getActiveSheet()->getColumnDimension('A')->setWidth('10')->setAutoSize(true);
//设置字体setName(字体)、setSize(大小)、setBold(粗体)、setUnderline(设置下划线)、setItalic(字体倾斜)
$objExcel->getActiveSheet()->getStyle('A1')->getFont()->setName('黑体')->setSize(20)
->setBold(true)->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE)->setItalic();
//设置字体颜色
$objExcel->getActiveSheet()->getStyle('A1')->getFont()->getColor()
->setARGB(PHPExcel_Style_Color::COLOR_BLUE);
//设置单元格边框样式(getTop、getLeft、getRight、getBottom)
$objExcel->getActiveSheet()->getStyle('B4')->getBorders()->getLeft()
->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
//设置单元格边背景
$objExcel->getActiveSheet()->getStyle('B5')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
//设置工作表保护(导出的表格为只读,不能编辑)
$objExcel->getActiveSheet()->getProtection()->setSheet(true); /*********************************************部分功能说明 end*********************************************/
//输出到浏览器(文件名为中文时要转码使用iconv或mb_convert_encoding)
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:inline;filename="'.$filename.'.xls"');
header("Content-Transfer-Encoding: binary");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
$objWriter->save('php://output');exit; ?>

下面是部分参数:

  setUnderline的部分参数:
    PHPExcel_Style_Font::UNDERLINE_NONE
    PHPExcel_Style_Font::UNDERLINE_DOUBLE(双下划线)
    PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING(双下划线)
    PHPExcel_Style_Font::UNDERLINE_SINGLE(下划线)
    PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING(下划线)

  setVertical参数:
    PHPExcel_Style_Alignment::VERTICAL_TOP(顶部)
    PHPExcel_Style_Alignment::VERTICAL_CENTER(垂直居中)
    PHPExcel_Style_Alignment::VERTICAL_BOTTOM(底部)
    PHPExcel_Style_Alignment::VERTICAL_JUSTIFY 

  setHorizontal参数:
    PHPExcel_Style_Alignment::HORIZONTAL_GENERAL
    PHPExcel_Style_Alignment::HORIZONTAL_LE
    PHPExcel_Style_Alignment::HORIZONTAL_CENTER(水平居中)
    PHPExcel_Style_Alignment::HORIZONTAL_RIGHT(右对齐)
    PHPExcel_Style_Alignment::HORIZONTAL_FILL
    PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY
    PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS

四、使用PHPExcel库对于大数据的支持度不是很好,很容易达到php内存上限,这里利用fputcsv写CSV(这是一种逗号分割值文件格式)

  

 <?php
// 输出Excel文件头,可把excel.csv换成你要的文件名
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="excel.csv"');
header('Cache-Control: max-age=0'); $db = @mysql_connect('localhost','root','root'); if(!$db){
die('Could not connect: ' . mysql_error());
} //设置字符集
mysql_query("set names utf8");
//打开数据库
mysql_select_db("database"); $sql = "SELECT id,'活动名称',user_id,u_name,reward,CASE r_level WHEN 1 THEN '中奖' WHEN 0 THEN '未中奖' END,CASE type WHEN 1 THEN '奖励1' WHEN '2' THEN '奖励2' WHEN 3 THEN '奖励3' END,add_time FROM tablename";
$result = mysql_query($sql); $head = array('id','活动名称','用户id','用户名','中奖额度','是否中奖','中奖类型','抽奖时间'); //打开php文件句柄,php://output表示直接输出到浏览器,a表示写入方式打开
$fp = fopen('php://output', 'a'); foreach($head as $key=>$val){
$head[$key] = mb_convert_encoding($val,'GBK','UTF-8');
} //将数据通过fputcsv写到文件句柄
fputcsv($fp,$head); //计数
$total = 0; //每隔1000行刷新一下缓存buffer,不要太大,也不要太小
$limit = 1000; if($result && mysql_num_rows($result)){
while($rows = mysql_fetch_row($result)){
$total++;
if($total == $limit){
//送出缓冲区的内容
ob_flush();
//刷新php程序的缓存
flush(); $total = 0;
} foreach($rows as $k=>$v){
$rows[$k] = mb_convert_encoding($v,'GBK','UTF-8');
} fputcsv($fp,$rows); }
62     die();
} ?>

php:PHPExcel导出excel表格的更多相关文章

  1. PHPExcel导出excel表格

    if(!function_exists('exportExcel')){    //导出excel文件    function exportExcel($datas, $save_method='ht ...

  2. PHPEXCEL导出excel表格中长数字文本自动转为科学计数法的解决办法

    方法一:前面加空格 $objActSheet->setCellValue('A1', ' '.'330602198804224688'); 方法二: $objActSheet->setCe ...

  3. tp5.0 composer下载phpexcel 实现导出excel 表格

    tp5.0 composer下载phpexcel 实现导出excel 表格 1.在下载好的tp5.0 框架里面使用 composer 下载phpexcel 的插件 composer require p ...

  4. PHP导入导出excel表格图片(转)

    写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xml的也用过,csv的就更不用谈了.呵呵.(COM方式不讲了,这种可读的太多了,我也写过利用wp ...

  5. php header函数导出excel表格

    推荐一个除了用PHPExcel导出表格之外的另外一种比较简单不需要引入类文件的表格导入方法——header()导出excel表格. 导出表格的步骤封装成了方法,以便于重复使用,代码如下: /** * ...

  6. PHP导入导出excel表格图片的代码和方法大全

    基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已.修改这种文件后再保存,通常会提示你是否要转换成Excel文件 ...

  7. java中使用jxl导出Excel表格详细通用步骤

    该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入s ...

  8. .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格

    一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...

  9. java导出excel表格

    java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...

随机推荐

  1. 推荐25款php中非常有用的类库

    推荐25款php中非常有用的类库 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014-09-29   作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许多多有用的库分发出 ...

  2. Allowed memory size Out of memory ini_set('memory_limit', '-1');

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 51 bytes) ini_set(' ...

  3. Strong AI Versus Weak AI

    Computer Science An Overview _J. Glenn Brookshear _11th Edition The conjecture that machines can be ...

  4. 设置session失效时间

    以X5部署在Tomcat上为例,说明如何设置session失效时间. 可以设置session失效时间的地点有三处,分别是 1.BusinessServer的session设置 \runtime\Bus ...

  5. nginx下php频繁卡死502

    解决:[WARNING] fpm_children_bury(), line 215: child 2736 (pool default) exited on signal 15 SIGTERM af ...

  6. 【转】Unity3D开发之Http协议网络通信

    之前unity3d项目要做跟服务器通信的模块,然后服务器那边的协议是基于http的Jsonrpc通信方式一开始,用C#的本身类HttpWebRequest来提交请求,很快就在电脑上面成功了,代码也很简 ...

  7. jira-cli,api,git,jenkins--version.txt

    cd ${WORKSPACE}/trunk/src/main/webapp/html/ echo $version | sed -e "s/X/${BUILD_NUMBER}/g" ...

  8. 【转载】拒绝平庸——浅谈WEB登录页面设计

    用户活跃度是检验产品成功与否的重要指标之一,传统行业的商家极为重视门面的装潢,因为一个好的门面可以聚集人气,招揽更多的顾客.古时候的大户人家院子门口的石狮子或其他的摆件的摆放极为讲究,有一定的风水学说 ...

  9. MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集(转)

    namespace Entity { public interface IPagedList { /// <summary> /// 记录数 /// </summary> in ...

  10. E1114 Temp Ambient

    这2天DELL服务器的指示灯变为了黄色 ,显示“ E1114 Ambient Temp exceeds allowed range“  原来是周围环境温度超出了许可范围 ,难道最近的天真的是太冷了 ”