当前位置:首页 > PHP教程 > php文件操作 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-15 21:24:25 浏览: 评论:0 

CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记。CSV文件是个纯文本文件,每一行表示一张图片的许多属性。下面小编给大家介绍下PHP下载生成的csv文件及问题总结。

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

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

  1. //要生成csv文件的数组 
  2. $csvArr=array(); 
  3. $csvArr[]=array('用户编号1','上班日期1','签到时间1','签退时间1'); 
  4. $csvArr[]=array('用户编号2','上班日期2','签到时间2','签退时间2'
  5. download_send_headers("data_export_" . date("Y-m-d") . ".csv"); 
  6. $head=array('用户编号','上班日期','签到时间','签退时间'); 
  7. echo array2csv($csvArr,$head); 
  8. unset($csvArr); 
  9. die(); 
  10. function array2csv(array &$array,$head
  11.   if (count($array) == 0) { 
  12.    return null; 
  13.   } 
  14.   ob_start(); 
  15.   $df = fopen("php://output"'w'); 
  16.   if(!$head){ 
  17.     $head=array_keys(reset($array)); 
  18.   } 
  19.   fputcsv($df,$head); 
  20.   foreach ($array as $row) { 
  21.    fputcsv($df$row); 
  22.   } 
  23.   fclose($df); 
  24.   return ob_get_clean(); 
  25. function download_send_headers($filename) { 
  26.   // disable caching 
  27.   $now = gmdate("D, d M Y H:i:s"); 
  28.   header("Expires: Tue, 03 Jul 2001 06:00:00 GMT"); 
  29.   header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate"); 
  30.   header("Last-Modified: {$now} GMT"); 
  31.   // force download  
  32.   header("Content-Type: application/force-download"); 
  33.   header("Content-Type: application/octet-stream"); 
  34.   header("Content-Type: application/download"); 
  35.   // disposition / encoding on response body 
  36.   header("Content-Disposition: attachment;filename={$filename}"); 
  37.   header("Content-Transfer-Encoding: binary"); 

php array生成csv文件

  1. <?php 
  2. $data = array
  3.     array'row_1_col_1''row_1_col_2''row_1_col_3' ), 
  4.     array'row_2_col_1''row_2_col_2''row_2_col_3' ), 
  5.     array'row_3_col_1''row_3_col_2''row_3_col_3' ), 
  6.   ); 
  7. $filename = "example"
  8.   header("Content-type: text/csv"); 
  9.   header("Content-Disposition: attachment; filename={$filename}.csv"); 
  10.   header("Pragma: no-cache"); 
  11.   header("Expires: 0"); 
  12. outputCSV($data); 
  13. function outputCSV($data) { 
  14.     $outputBuffer = fopen("php://output"'w'); 
  15.     foreach($data as $val) { 
  16.     foreach ($val as $key => $val2) { 
  17.      $val[$key] = iconv('utf-8''gbk'$val2); 
  18. // CSV的Excel支持GBK编码,一定要转换,否则乱码 
  19.      } 
  20.       fputcsv($outputBuffer$val); 
  21.     } 
  22.     fclose($outputBuffer); 
  23.   } 
  24. ?> 

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

环境linux

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

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

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

  1. function __fgetcsv(& $handle$length = null, $d = ','$e = '"') { 
  2.    $d = preg_quote($d); 
  3.    $e = preg_quote($e); 
  4.    $_line = ""
  5.    $eof=false; 
  6.    while ($eof != true) { 
  7.      $_line .= (emptyempty ($length) ? fgets($handle) : fgets($handle$length)); 
  8.      $itemcnt = preg_match_all('/' . $e . '/'$_line$dummy); 
  9.      if ($itemcnt % 2 == 0) 
  10.        $eof = true; 
  11.    } 
  12.    $_csv_line = preg_replace('/(?: |[ ])?$/'$d, trim($_line)); 
  13.    $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/'
  14.    preg_match_all($_csv_pattern$_csv_line$_csv_matches); 
  15.    $_csv_data = $_csv_matches[1]; 
  16.    for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) { 
  17.      $_csv_data[$_csv_i] = preg_replace('/^' . $e . '(.*)' . $e . '$/s''$1' , $_csv_data[$_csv_i]); 
  18.      $_csv_data[$_csv_i] = str_replace($e . $e$e$_csv_data[$_csv_i]); 
  19.    } 
  20.    return emptyempty ($_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。

  1. <?php 
  2. $now = gmdate("D, d M Y H:i:s"); 
  3. header("Expires: Tue, 03 Jul 2001 06:00:00 GMT"); 
  4. header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate"); 
  5. header("Last-Modified: {$now} GMT"); 
  6. // force download 
  7. header("Content-Type: application/force-download"); 
  8. header("Content-Type: application/octet-stream"); 
  9. header("Content-Type: application/download"); 
  10. // disposition / encoding on response body 
  11. header("Content-Disposition: attachment;filename={$filename}"); 
  12. header("Content-Transfer-Encoding: binary"); 
  13. $items_data=array
  14. '0'=>array('title'=>'test test test1'), 
  15. '1'=>array('title'=>'test test test2'), 
  16. '2'=>array('title'=>'test test test3'
  17. print(chr(0xEF).chr(0xBB).chr(0xBF)); 
  18. //设置utf-8 + bom ,处理汉字显示的乱码 
  19. echo array2csv($items_data); 
  20. function array2csv(array &$array
  21.   if (count($array) == 0) { 
  22.    return null; 
  23.   } 
  24.   ob_start(); 
  25.   $df = fopen("php://output"'w'); 
  26.   fputcsv($dfarray_keys(reset($array))); 
  27.   foreach ($array as $row) { 
  28.    fputcsv($df$row); 
  29.   } 
  30.   fclose($df); 
  31.   return ob_get_clean(); 
  32. ?> 

导出csv文件数字会自动变科学计数法的解决方法

用程序导出的csv文件,当字段中有比较长的数字字段存在时,在用excel软甲查看csv文件时就会变成科学技术法的表现形式。

其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法;如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0。

解决这个问题

只要把数字字段后面加上显示上看不见的字符即可,字符串结尾加上制表符"\t".

php 程序可以这样判断,注意一定是"\t",不是'\t'.代码如下:

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

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

Tags: PHP下载生成csv

分享到: