PHP下载生成的csv文件及问题总结 |
最近做了一个项目需要把订单的信息显示出来,并且能够把相关信息放到一个.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 $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文件数字会自动变科学计数法的解决方法 复制代码 代码如下: is_numeric($val)?$val."\t":$val; 以上代码内容就是本文实现PHP下载生成的csv文件及问题总结,希望大家喜欢 。 |