PHP下载生成的csv文件及问题总结


Posted in PHP onAugust 06, 2015

最近做了一个项目需要把订单的信息显示出来,并且能够把相关信息放到一个.csv 文件中,下载到浏览器。虽然说csv是一种比较简单的excel表格形式,生成只要按指定格式然后生成.csv文件就可以,但是在使用中也会遇到很多问题,下面给大家分享下PHP下载csv文件及问题总结

首先大家先看个例子,生成csv文件并下载

//要生成csv文件的数组
$csvArr=array();
$csvArr[]=array('用户编号1','上班日期1','签到时间1','签退时间1');
$csvArr[]=array('用户编号2','上班日期2','签到时间2','签退时间2')
download_send_headers("data_export_" . date("Y-m-d") . ".csv");
$head=array('用户编号','上班日期','签到时间','签退时间');
echo array2csv($csvArr,$head);
unset($csvArr);
die();
function array2csv(array &$array,$head)
{
  if (count($array) == 0) {
   return null;
  }
  ob_start();
  $df = fopen("php://output", 'w');
  if(!$head){
    $head=array_keys(reset($array));
  }
  fputcsv($df,$head);
  foreach ($array as $row) {
   fputcsv($df, $row);
  }
  fclose($df);
  return ob_get_clean();
}
function download_send_headers($filename) {
  // disable caching
  $now = gmdate("D, d M Y H:i:s");
  header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
  header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
  header("Last-Modified: {$now} GMT");
  // force download 
  header("Content-Type: application/force-download");
  header("Content-Type: application/octet-stream");
  header("Content-Type: application/download");
  // disposition / encoding on response body
  header("Content-Disposition: attachment;filename={$filename}");
  header("Content-Transfer-Encoding: binary");
}

php array生成csv文件

<?php
$data = array(
    array( 'row_1_col_1', 'row_1_col_2', 'row_1_col_3' ),
    array( 'row_2_col_1', 'row_2_col_2', 'row_2_col_3' ),
    array( 'row_3_col_1', 'row_3_col_2', 'row_3_col_3' ),
  );
$filename = "example";
  header("Content-type: text/csv");
  header("Content-Disposition: attachment; filename={$filename}.csv");
  header("Pragma: no-cache");
  header("Expires: 0");
outputCSV($data);
function outputCSV($data) {
    $outputBuffer = fopen("php://output", 'w');
    foreach($data as $val) {
    foreach ($val as $key => $val2) {
     $val[$key] = iconv('utf-8', 'gbk', $val2);
// CSV的Excel支持GBK编码,一定要转换,否则乱码
     }
      fputcsv($outputBuffer, $val);
    }
    fclose($outputBuffer);
  }
?>

解决 fgetcsv函数在php5.2.8 中的bug

环境linux

问题解析出来的数据不完整,有为空的字段

网上查了下说是在php5.2.8 中存在bug

解决办法是使用自定义函数

function __fgetcsv(& $handle, $length = null, $d = ',', $e = '"') {
   $d = preg_quote($d);
   $e = preg_quote($e);
   $_line = "";
   $eof=false;
   while ($eof != true) {
     $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
     $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
     if ($itemcnt % 2 == 0)
       $eof = true;
   }
   $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));
   $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
   preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
   $_csv_data = $_csv_matches[1];
   for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
     $_csv_data[$_csv_i] = preg_replace('/^' . $e . '(.*)' . $e . '$/s', '$1' , $_csv_data[$_csv_i]);
     $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
   }
   return empty ($_line) ? false : $_csv_data;
}

excel无法正确读取长度超过32K的CSV域问题
php 导出csv文件用excel打开后,产品表述字段分两行显示。
查看了下这个字段发现这个字段超过32K的字符,excel会把字符串打断成两行,如果小于32K,显示正常。
这是EXCEL的限制,目前还没有找到解决办法。
excel一个单元格最多是32767个字符。
解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题
PHP生成UTF-8编码的CSV文件用Excel打开中文显示乱码,是由于输出的CSV文件中没有BOM。

<?php
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
// force download
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
$items_data=array(
'0'=>array('title'=>'test test test1'),
'1'=>array('title'=>'test test test2'),
'2'=>array('title'=>'test test test3')
)
print(chr(0xEF).chr(0xBB).chr(0xBF));
//设置utf-8 + bom ,处理汉字显示的乱码
echo array2csv($items_data);
function array2csv(array &$array)
{
  if (count($array) == 0) {
   return null;
  }
  ob_start();
  $df = fopen("php://output", 'w');
  fputcsv($df, array_keys(reset($array)));
  foreach ($array as $row) {
   fputcsv($df, $row);
  }
  fclose($df);
  return ob_get_clean();
}
?>

导出csv文件数字会自动变科学计数法的解决方法
用程序导出的csv文件,当字段中有比较长的数字字段存在时,在用excel软甲查看csv文件时就会变成科学技术法的表现形式。
其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法;如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0。
解决这个问题
只要把数字字段后面加上显示上看不见的字符即可,字符串结尾加上制表符"\t".
php 程序可以这样判断,注意一定是"\t",不是'\t'.

is_numeric($val)?$val."\t":$val;

以上代码内容就是本文实现PHP下载生成的csv文件及问题总结,希望大家喜欢。

PHP 相关文章推荐
实用函数4
Nov 08 PHP
为IP查询添加GOOGLE地图功能的代码
Aug 08 PHP
深入php self与$this的详解
Jun 08 PHP
数组与类使用PHP的可变变量名需要的注意的问题
Jun 20 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP 获取 ping 时间的实现方法
Sep 29 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
php防止表单重复提交实例讲解
Feb 11 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 PHP
PHP获取一年有几周以及每周开始日期和结束日期
Aug 06 #PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 #PHP
php实现无限级分类(递归方法)
Aug 06 #PHP
PHP常用的排序和查找算法
Aug 06 #PHP
PHP处理会话函数大总结
Aug 05 #PHP
PHP实现合并discuz用户
Aug 05 #PHP
举例详解PHP脚本的测试方法
Aug 05 #PHP
You might like
php 函数中使用static的说明
2012/06/01 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
PHP Cookie学习笔记
2016/08/23 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
Node.js自定义实现文件路由功能
2017/09/22 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
videocapture库制作python视频高速传输程序
2013/12/23 Python
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
毕业自我鉴定
2013/11/05 职场文书
积极分子思想汇报
2014/01/04 职场文书
法人代表任命书范本
2014/06/05 职场文书
元旦趣味活动方案
2014/08/22 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS