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

方法: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. Android开发的七大环节

    Android开发的七大环节   浏览:25 发布日期:2015/10/27 分类:职场感悟 一个完整的Android 开发流程主要包括策划.软件.交互.视觉.测试.运营维护这七大环节,其中的每一个环 ...

  2. [源码]随机获取虾米音乐song_id API文件

    [源码]随机获取虾米音乐song_id API文件 January 11, 2015 注意:此API请放置于国内主机使用,如香港.北京等等,否则会提示:虾米音乐在您所处的国家或地区暂时无法使用 < ...

  3. Deep_learning

    https://en.wikipedia.org/wiki/Deep_learning

  4. 一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出。

    主要掌握String中的方法 char[] toCharArray()           将此字符串转换为一个新的字符数组. int indexOf(String str)           返回 ...

  5. android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.

    在当前工程目录中 gradle.properties 添加org.gradle.jvmargs=-XX\:MaxHeapSize\=256m -Xmx256m http://stackoverflow ...

  6. php数据访问:pdo用法、事物回滚功能和放sql注入功能

    PDO:    一.含义:        数据访问抽象层    二.作用        通过PDO能够访问其它的数据库    三. 用法:        1.造对象            ① $pdo ...

  7. 简单CMakeLists.txt文件

    #CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(server) #添加包含目录 include_directories(./in ...

  8. uzqp文件的加解密

    帮朋友做的,根据python版本翻译成的java版本,记录一下代码 import java.io.File; import java.io.FileInputStream; import java.i ...

  9. Java调用ASP.NET的webservice故障排除

    公司要接入其它公司的一个业务功能,对方是提供的 .net产生的webservice,在用cxf的wsdl2java命令生成客户端的测试代码时,出现了如下故障WSDLToJava Error: Thro ...

  10. 几个简单的html+css+js题目

    1.页面中有一图片,请在下划线处添加代码能够实现隐藏该图片的功能 <img id="pic" src="door.jpg" width="200 ...