PHP导出excel文件的几种方式

2023-10-26

先说说动态生成的内容当作文件来下载的方法:

1、通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来下载;content-type内容设置可以参看:

http://www.ostools.net/commons

2、用Content-Disposition设置下载的文件名;

3、 基本上,下载程序都是这么写的:

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

4、当然要考虑到浏览器兼容性和对如果文件名是中文的话出现异常bug,我们这么写:

<?php  
$ua = $_SERVER["HTTP_USER_AGENT"];  
$filename = "文件名.txt";  
$encoded_filename = urlencode($filename);  
$encoded_filename = str_replace("+", "%20", $encoded_filename);  
header('Content-Type: application/octet-stream');  
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';  
?>

明白了这些之后,生成excel就很简单了,处理下下载文档格式,解析数据,balabala就好了,看看怎么生成一篇excel的文档吧:

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

<?php  
 $DB_Server = "localhost";  
 $DB_Username = "root";  
 $DB_Password = "";  
 $DB_DBName = "DBName";  
 $DB_TBLName = "DB_TBLName";  
 $savename = date("YmjHis");  
 $Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password) or die("Couldn't connect.");  
 mysql_query("Set Names 'gbk'");  
 $file_type = "vnd.ms-excel";  
 $file_ending = "xls";  
 header("Content-Type: application/$file_type;charset=gbk");  
 header("Content-Disposition: attachment; filename=".$savename.".$file_ending");  
 header("Pragma: no-cache");  
 $now_date = date("Y-m-j H:i:s");  
 $title = "数据库名:$DB_DBName,数据表:$DB_TBLName,备份日期:$now_date";  
 $sql = "Select * from $DB_TBLName";  
 $ALT_Db = @mysql_select_db($DB_DBName, $Connect) or die("Couldn't select  database");  
 $result = @mysql_query($sql,$Connect) or die(mysql_error());  
 echo("$title\n");  
 $sep = "\t";  
 for ($i = 0;$i < mysql_num_fields($result);$i++)  
    {  
        echo mysql_field_name($result,$i) . "\t";  
    }  
 print("\n");  
 $i = 0;  
 while($row = mysql_fetch_row($result))  
 {  
   $schema_insert = "";  
   for($j=0; $j<mysql_num_fields($result);$j++)  
     {  
       if(!isset($row[$j])) $schema_insert .= "NULL".$sep;  
       elseif ($row[$j] != "") $schema_insert .= "$row[$j]".$sep;  
       else $schema_insert .= "".$sep;  
      }  
      $schema_insert = str_replace($sep."$", "", $schema_insert);  
      $schema_insert .= "\t";  
      print(trim($schema_insert));  
      print "\n"; $i++;  
 }  
 return (true);  
 ?>

2、用PHPExcel库

下面是用PHPExcel实现的与上面功能相同的excel的方法。getCol为递归实现的函数,用于根据数字返回对应的列号编码。因为导出的过程中需要指出行号,列号。行号为简单的数字,而列号则为“A-Z”的组合。为了方便二维数组的导入,根据列数自动得到列号编码。如“5”->“E”、“27”->“AZ”。

//设置PHPExcel类库的include path  
$dirToLib1='./resource/PHPExcel1.7.0/Classes';  
ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.$dirToLib1);  

function getCol($num){//递归方式实现根据列数返回列的字母标识  
        $arr=array(0=>'Z',1=>'A',2=>'B',3=>'C',4=>'D',5=>'E',6=>'F',7=>'G',8=>'H',9=>'I',10=>'J',11=>'K',12=>'L',13=>'M',14=>'N',15=>'O',16=>'P',17=>'Q',18=>'R',19=>'S',20=>'T',21=>'U',22=>'V',23=>'W',24=>'X',25=>'Y',26=>'Z');  
        if($num==0)  
        return '';  
        return $this->getCol((int)(($num-1)/26)).$arr[$num%26];  
    }   
function exportToExcel($header,$data,$fileName){
//利用PHPExcel工具进行导出,功能强大,格式规范,可导出2007  
        $fileName=$this->UTF8ToGBK($fileName);    
        $objExcel = new PHPExcel();  
        $objWriter = new PHPExcel_Writer_Excel5($objExcel);  
        $objExcel->setActiveSheetIndex(0);  
        $objActSheet = $objExcel->getActiveSheet();  
        //设置当前活动sheet的名称  
        //$objActSheet->setTitle('测试Sheet');   
        //*************************************  
        //设置单元格内容  
        $i=1;  
        foreach ($header as $key => $value){  
            $objActSheet->setCellValueExplicit($this->getCol($i).'1', $value,PHPExcel_Cell_DataType::TYPE_STRING);  
            //*************************************  
            //设置单元格样式  
            $objStyle = $objActSheet->getStyle($this->getCol($i++).'1');  
            //设置边框  
            $objBorder = $objStyle->getBorders();  
    $objBorder->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  
    $objBorder->getTop()->getColor()->setARGB('FFDDDDDD');                          $objBorder->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  
    $objBorder->getBottom()->getColor()->setARGB('FFDDDDDD');  
            $objBorder->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  
            $objBorder->getLeft()->getColor()->setARGB('FFDDDDDD'); // color  
         $objBorder->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);  
            $objBorder->getRight()->getColor()->setARGB('FFDDDDDD'); // color  
            //设置填充颜色  
            $objFill = $objStyle->getFill();  
            $objFill->setFillType(PHPExcel_Style_Fill::FILL_SOLID);  
            $objFill->getStartColor()->setARGB('FF00EEEE');  
        }  
        $i=1;  
        foreach ($data as $row){  
            $i++;  
            $j=1;  
            foreach ($header as $key => $value){  
                $objActSheet->setCellValueExplicit($this->getCol($j++).$i, $row[$key],PHPExcel_Cell_DataType::TYPE_STRING);  
            }  
        }  
        //*************************************  
        //输出内容  
        //到浏览器  
        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');  
    }

3、用PHPExcel等库,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限。这里的方法是利用fputcsv写CSV(这是一种逗号分隔值文件格式,见http://baike.baidu.com/view/468993.htm)文件的方法,直接向浏览器输出Excel文件:

<?php  
// 输出Excel文件头,可把user.csv换成你要的文件名  
header('Content-Type: application/vnd.ms-excel');  
header('Content-Disposition: attachment;filename="user.csv"');  
header('Cache-Control: max-age=0');     
// 从数据库中获取数据,为了节省内存,不要把数据一次性读到内存,从句柄中一行一行读即可  
$sql = 'select * from tbl where ……';  
$stmt = $db->query($sql);     
// 打开PHP文件句柄,php://output 表示直接输出到浏览器  
$fp = fopen('php://output', 'a');    
// 输出Excel列名信息  
$head = array('姓名', '性别', '年龄', 'Email', '电话', '……');  
foreach ($head as $i => $v) {  
    // CSV的Excel支持GBK编码,一定要转换,否则乱码  
    $head[$i] = iconv('utf-8', 'gbk', $v);  
}    
// 将数据通过fputcsv写到文件句柄  
fputcsv($fp, $head);   
// 计数器  
$cnt = 0;  
// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小  
$limit = 100000;    
// 逐行取出数据,不浪费内存  
while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) {   
    $cnt ++;  
    if ($limit == $cnt) { 
        //刷新一下输出buffer,防止由于数据过多造成问题  
        ob_flush();  
        flush();  
        $cnt = 0;  
    }  

    foreach ($row as $i => $v) {  
        $row[$i] = iconv('utf-8', 'gbk', $v);  
    }  
    fputcsv($fp, $row);  
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP导出excel文件的几种方式 的相关文章

  • “为什么”脚本不打印任何内容? [复制]

    这个问题在这里已经有答案了 当我运行以下脚本时 没有打印任何内容 为什么会这样呢 echo var gt 它回显 无 因为您的浏览器无法理解
  • 如何将自定义类型数组传递给 Postgres 函数

    我有一个自定义类型 CREATE TYPE mytype as id uuid amount numeric 13 4 我想将它传递给具有以下签名的函数 CREATE FUNCTION myschema myfunction id uuid
  • PMA 4.5.2.0 file_exists():open_basedir 限制生效

    从 PPA 在我的 Ubuntu 服务器上安装 phpMyAdmin 后 https launchpad net nijel archive ubuntu phpmyadmin https launchpad net nijel archi
  • 如何锁定特定单元格但允许过滤和排序

    我使用以下代码来锁定某些单元格的内容 Sub LockCell ws As Worksheet strCellRng As String With ws Unprotect Cells Locked False Range strCellR
  • 如何让 shell_exec 在 IIS 6.0 上运行

    问题 我有一个 PHP 脚本 它使用shell exec运行 pdf 到文本转换器 为了简化问题 我创建了一个简短的脚本 使用shell exec只是回显的输出dir命令 当我在 Apache 服务器上运行它时 一切都按预期运行 当我切换到
  • 使用 PHP/COM/ADSI/LDAP 更改 AD 密码

    我已经被这个问题困扰了好几天了 我尝试了各种解决方案均无济于事 请帮忙 Problem 我们有两个域控制器 它们不属于我们的管理范围 我们能够通过端口 389 上的 LDAP 进行连接 但无法通过端口 636 安全连接 我们正在开发一个系统
  • Ubuntu 18.04升级后php7.2-curl无法安装

    今天从 16 04 升级到 18 04do release upgrade d 在升级过程中 我被告知一些软件包将被删除 其中包括 删除 libperl5 22 lxc common perl modules 5 22 php imagic
  • 如何验证使用 php 上传的文件不包含可执行二进制文件?

    使用简单的 Firefox 插件 黑客可以更改他们想要上传的任何文件的 MIME 类型 绕过文件类型检查器 然后 黑客可以使用 GIMP 等程序将 php 脚本嵌入到图像 音频或任何其他文件的二进制数据中 我该如何检查并防止这种情况发生 您
  • 以独立于区域设置的方式读取 Excel 文件

    我使用以下代码从各种 Excel 文件读取数据 IMEX 1 to force strings on mixed data HDR NO to process all the available data Locale 1033 is en
  • Javascript 函数与 php 一样吗?

    我在网站上使用 WebIM 提供聊天支持 我希望能够在客户端启动聊天会话时设置一个计时器 如果操作员 技术人员在 x 秒内没有响应 我希望页面重定向到客户端可以留言的另一个页面 有点像 请稍等 我们尝试联系您 这样 如果所有技术人员都太忙或
  • $_POST、$_GET 和 $_REQUEST 之间有什么区别?

    我对这些超级全局变量有点困惑 POST GET and REQUEST 在 PHP 中 在 PHP 中哪些场景需要使用这些变量 这三个变量的主要区别是什么 POST是在使用 application x www form urlencoded
  • 将 PHP mcrypt 与 Rijndael/AES 结合使用

    我正在尝试使用 php 中的 mcrypt 和密码 Rijndael 加密一些文本消息 但我不确定 MCRYPT MODE modename 根据 PHP 手册 这些可用 ecb cbc cfb ofb nofb 或 stream 但我读到
  • 通过 AJAX 发送 XML

    我在 jQuery 中创建了一个 xml 文档 如下所示 var xmlDocument
  • Opencart最低下单价不包括一类

    我正在使用 opencart 并成功为所有交易添加了最低订单价格 这是我使用的代码 div div div class warning Minimum 10 Euro to checkout div 现在我想从中排除一个类别 以便可以购买该
  • 使用 Excel 2010 通过存储过程读取/写入 SQL Server 2008 数据库

    我们有一个 SQL Server 2008 数据库 它有存储过程来处理读 写等 这些过程由各种应用程序内部使用 需要一个人直接更新数据库中名为 Employee 的表 更新非常简单 更新 VARCHAR 和 INT 外键 字段 问题是 Sh
  • 在适用于 Windows 和 Mac 的 VBA 中指定用户文件夹的路径

    我正在编写一个使用 VBA 从 Excel 生成文件的工具 生成的文件将写入用户的 Documents 文件夹中的文件夹 如果存在 e g C Users
  • Twig:选择某些块并渲染它们

    我正在将 twig 模板引擎集成到 PHP 应用程序中 特别是 我想使用 twig 引擎来渲染表单 了解了 symfony2 如何使用 twig 渲染表单小部件后 他们有一个巨大的模板文件 其中包含所有小部件 如下所示 block pass
  • 使用php将文本文件转换为xml?

    data txt ha15rs 250 home2 gif 2 ha36gs 150 home3 gif 1 ha27se 300 home4 gif 4 ha4678 200 home5 gif 5 我想使用 php 使用 simplex
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • PHP简单的html dom解析器与wordpress冲突吗?

    PHP简单的html dom解析器与wordpress冲突吗 因为每当我尝试将其与此代码一起包含在我的标头中时 一切都变成空白 感谢您提前提供任何帮助 当我尝试在 HTML 文档中使用 PHP 包含时 我遇到了同样的问题 但当我使用func

随机推荐

  • 第一个JDBC程序

    JDBC 1 数据库驱动 例如 声卡 显卡 驱动等 2 JDBC SUN公司为了简化开发人员的 对数据库的统一 操作 提供了一个 Java操作数据库的 规范 俗称JDBC这些规范的实现由具体的厂商去做 对于开发人员来说 我们只需要掌握JDB
  • 【线性代数】逆矩阵的求解过程

    一 方阵的行列式 二 逆矩阵 2 1 使用Numpy 求例2的逆矩阵 import numpy as np A np mat 1 2 3 2 2 1 3 4 3 print 计算A行列式的值 print np linalg det A pr
  • Boost升压电路学习框架

    此文为个人学习框架 如有错误请大家指点 目录 一 Boost电路是什么 二 为什么要用Boost电路 1 还有什么升压电路 其区别是什么 三 Boost电路的模式 1 Boost开环电路 1 1Boost开环电路是什么 1 2Boost开环
  • 软考-软件设计师-数据库1-体系结构-模型-关系代数-规范化

    1 数据库技术基础 2 基本概念 数据库系统DBS 是一个采用了数据库技术 有组织地 动态地存储大量有关数据 方便多用户访问的计算机系统 其由下面四个部分组成 数据库 统一管理 长期存储在计算机内的 有组织的相关数据的集合 硬件 构成计算机
  • Java文件上传【通用】

    Java文件上传 主要是针对于网页来说 一般是通过input的file类型上传文件流到后台 再通过后台处理将文件移动到指定位置达到上传的目的 这里贴代码时 主要是以springboot框架为例 但是是通用的 1 表单提交上传
  • django从1.7升级到1.9后 提示:RemovedInDjango110Warning

    Django项目 把django从1 7升级到1 9后 大量报错 需要做如下修改 1 修改urls py 在django1 9里 urls的配置不再支持字符串型的路由 需要先import 然后直接引用 更加清晰 比如 urlpatterns
  • elk笔记5.2--logstash使用

    elk笔记5 2 logstash使用 1 介绍 2 使用案例 2 1 通过type隔离多个索引 2 2 通过pipeline隔离多个索引 3 注意事项 4 说明 1 介绍 logstash 资源充足的情况下 每个logstash示例采集
  • PromQL的简单使用

    PromQL的简单使用 一 背景 二 PromQL的数据类型 三 字面量 1 字符串字面量 2 浮点数字面量 四 时间序列选择器 1 即时向量选择器 1 组成部分 2 指标名称和匹配器的组合 3 匹配器 2 区间向量选择器 1 时间格式 3
  • 流媒体压力测试工具—推拉流

    目录 前言 介绍 St load 安装篇 推流篇 拉流篇 前言 流媒体压力测试是评估流媒体系统性能和稳定性的重要环节 它可以模拟大量用户同时推送和拉取流媒体数据 以验证系统在高负载情况下的表现 为了进行流媒体压力测试 我们可以使用推拉流工具
  • DN值、辐射率、反射率等

    数字量化值 Digital Number DN 像素值的通用术语是数字量化值或DN值 它通常被用来描述还没有校准到具有意义单位的像素值 如果你只是想看一个图像 和不打算解释像素值的物理意义 那么就可以以DN值的方式来保存 辐射率 Radia
  • 极智AI

    欢迎关注我的公众号 极智视界 获取我的更多笔记分享 大家好 我是极智视界 本文讲解一下 C 手写 softmax 激活函数 在多分类任务中 最后通常使用 softmax 函数作为网络输出层的激活函数 softmax 函数可以对输出值作归一化
  • 互联网络安全、信息安全、计算机网络安全、信息保障有什么区别?

    据CNBC报道 由于黑客 安全漏洞和恶意软件攻击继续成为行业媒体报道的头条新闻 网络犯罪已成为一种全球 流行病 去年对全球组织和人员造成的损失约6000亿美元 因此 打击此类活动已成为一项有利可图且有益的事业 这并不奇怪 所以 如果你正在考
  • 【力扣】1337.矩阵中战斗力最弱的k行

    给你一个大小为 m n 的矩阵 mat 矩阵由若干军人和平民组成 分别用 1 和 0 表示 请你返回矩阵中战斗力最弱的 k 行的索引 按从最弱到最强排序 如果第 i 行的军人数量少于第 j 行 或者两行军人数量相同但 i 小于 j 那么我们
  • Spring中ApplicationContext加载机制

    加载器目前有两种选择 ContextLoaderListener和ContextLoaderServlet 只是一个是基于Servlet2 3版本中新引入的Listener接口实现 而另一个基于Servlet接口实现 开发中可根据目标Web
  • 【网站汇总】一些OJ平台

    目录 前言 一 HDU孵化器 二 HDU OJ 三 PTA 四 洛谷 五 力扣 LeetCode 前言 以下是一些OJ平台 一 HDU孵化器 链接 http hdufhq cn 8888 二 HDU OJ 链接 http code hdu
  • Linux下删除正在写入的文件会发生什么?

    一 成功 删除 了一个正在写入的文件 某日 我启动了一个进程 向一个文件a txt中写入内容 但不小心在另一个窗口用命令rm f a txt把它删除了 我以为这应该会触发一个警告 比如 不能删除一个打开的正在写入的文件 之类的 结果命令干脆
  • WinServer 2012 AD 组策略 用户发布软件部署

    本例演示安装 Notepad 这款软件 因为域中发布软件只支持 msi 格式 所以要把 exe 转成 msi 格式 可以用这个软件 https www advancedinstaller com 1 转换格式 1 选择 MSI from E
  • 数学建模 - 数学规划

    来自清风的数学建模课程 主要是用于自己复习看 所以截图较多 数学规划 概述 分类 线性规划 非线性规划 整数规划 0 1规划 线性规划 对于求解最大值要让目标函数的系数 max z min z 线性规划公式 x fval linprog c
  • 第十四届蓝桥杯模拟赛(第一期)——C语言版

    1 二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数 在二进制中对应 10 是 2 位数 十进制整数 22 在十进制中是 2 位数 在二进制中对应 10110 是 5 位数 请问十进制整数 2022 在二进制中是几位数 incl
  • PHP导出excel文件的几种方式

    先说说动态生成的内容当作文件来下载的方法 1 通过把Content Type设置为application octet stream 可以把动态生成的内容当作文件来下载 content type内容设置可以参看 http www ostool