PHP下載生成的csv文件及問題總結(jié)
最近做了一個項目需要把訂單的信息顯示出來,并且能夠把相關信息放到一個.csv 文件中,下載到瀏覽器。雖然說csv是一種比較簡單的excel表格形式,生成只要按指定格式然后生成.csv文件就可以,但是在使用中也會遇到很多問題,下面給大家分享下PHP下載csv文件及問題總結(jié)
首先大家先看個例子,生成csv文件并下載
//要生成csv文件的數(shù)組
$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編碼,一定要轉(zhuǎn)換,否則亂碼
}
fputcsv($outputBuffer, $val);
}
fclose($outputBuffer);
}
?>
解決 fgetcsv函數(shù)在php5.2.8 中的bug
環(huán)境linux
問題解析出來的數(shù)據(jù)不完整,有為空的字段
網(wǎng)上查了下說是在php5.2.8 中存在bug
解決辦法是使用自定義函數(shù)
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打開后,產(chǎn)品表述字段分兩行顯示。
查看了下這個字段發(fā)現(xiàn)這個字段超過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文件數(shù)字會自動變科學計數(shù)法的解決方法
用程序?qū)С龅腸sv文件,當字段中有比較長的數(shù)字字段存在時,在用excel軟甲查看csv文件時就會變成科學技術法的表現(xiàn)形式。
其實這個問題跟用什么語言導出csv文件沒有關系。Excel顯示數(shù)字時,如果數(shù)字大于12位,它會自動轉(zhuǎn)化為科學計數(shù)法;如果數(shù)字大于15位,它不僅用于科學技術費表示,還會只保留高15位,其他位都變0。
解決這個問題
只要把數(shù)字字段后面加上顯示上看不見的字符即可,字符串結(jié)尾加上制表符"\t".
php 程序可以這樣判斷,注意一定是"\t",不是'\t'.
is_numeric($val)?$val."\t":$val;
以上代碼內(nèi)容就是本文實現(xiàn)PHP下載生成的csv文件及問題總結(jié),希望大家喜歡。
- php導入csv文件碰到亂碼問題的解決方法
- 基于PHP讀取csv文件內(nèi)容的詳解
- php使用fgetcsv讀取csv文件出現(xiàn)亂碼的解決方法
- 詳解PHP導入導出CSV文件
- PHP按行讀取、處理較大CSV文件的代碼實例
- php將csv文件導入到mysql數(shù)據(jù)庫的方法
- php對csv文件的讀取,寫入,輸出下載操作詳解
- php中數(shù)據(jù)的批量導入(csv文件)
- php寫入數(shù)據(jù)到CSV文件的方法
- php fputcsv命令 寫csv文件遇到的小問題(多維數(shù)組連接符)
- PHP實現(xiàn)CSV文件的導入和導出類
- php實現(xiàn)的讀取CSV文件函數(shù)示例
相關文章
深入apache配置文件httpd.conf的部分參數(shù)說明
本篇文章是對apache配置文件httpd.conf的部分參數(shù)說明進行了詳細的分析介紹,需要的朋友參考下2013-06-06
PHP中file_put_contents追加和換行的實現(xiàn)方法
下面小編就為大家?guī)硪黄狿HP中file_put_contents追加和換行的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
php mysql操作mysql_connect連接數(shù)據(jù)庫實例詳解
php操作數(shù)據(jù)庫首先必須連接到指定的數(shù)據(jù)庫,連接數(shù)據(jù)庫可以使用PHP mysql_connect函數(shù),本文章向大家介紹mysql_connect函數(shù)的使用方法和實例,需要的朋友可以參考一下2016-12-12
PHP中=賦值操作符對不同數(shù)據(jù)類型的不同行為
在Mac OS下搭建LNMP開發(fā)環(huán)境的步驟詳解
實現(xiàn)在同一方法中獲取當前方法中新賦值的session值解決方法

