php 下载.csv,PHP生成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;

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值