PHP下載生成的csv文件及問(wèn)題總結(jié)
最近做了一個(gè)項(xiàng)目需要把訂單的信息顯示出來(lái),并且能夠把相關(guān)信息放到一個(gè).csv 文件中,下載到瀏覽器。雖然說(shuō)csv是一種比較簡(jiǎn)單的excel表格形式,生成只要按指定格式然后生成.csv文件就可以,但是在使用中也會(huì)遇到很多問(wèn)題,下面給大家分享下PHP下載csv文件及問(wèn)題總結(jié)
首先大家先看個(gè)例子,生成csv文件并下載
//要生成csv文件的數(shù)組 $csvArr=array(); $csvArr[]=array('用戶編號(hào)1','上班日期1','簽到時(shí)間1','簽退時(shí)間1'); $csvArr[]=array('用戶編號(hào)2','上班日期2','簽到時(shí)間2','簽退時(shí)間2') download_send_headers("data_export_" . date("Y-m-d") . ".csv"); $head=array('用戶編號(hào)','上班日期','簽到時(shí)間','簽退時(shí)間'); 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
問(wèn)題解析出來(lái)的數(shù)據(jù)不完整,有為空的字段
網(wǎng)上查了下說(shuō)是在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無(wú)法正確讀取長(zhǎng)度超過(guò)32K的CSV域問(wèn)題
php 導(dǎo)出csv文件用excel打開(kāi)后,產(chǎn)品表述字段分兩行顯示。
查看了下這個(gè)字段發(fā)現(xiàn)這個(gè)字段超過(guò)32K的字符,excel會(huì)把字符串打斷成兩行,如果小于32K,顯示正常。
這是EXCEL的限制,目前還沒(méi)有找到解決辦法。
excel一個(gè)單元格最多是32767個(gè)字符。
解決PHP生成UTF-8編碼的CSV文件用Excel打開(kāi)亂碼的問(wèn)題
PHP生成UTF-8編碼的CSV文件用Excel打開(kāi)中文顯示亂碼,是由于輸出的CSV文件中沒(méi)有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)); //設(shè)置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(); } ?>
導(dǎo)出csv文件數(shù)字會(huì)自動(dòng)變科學(xué)計(jì)數(shù)法的解決方法
用程序?qū)С龅腸sv文件,當(dāng)字段中有比較長(zhǎng)的數(shù)字字段存在時(shí),在用excel軟甲查看csv文件時(shí)就會(huì)變成科學(xué)技術(shù)法的表現(xiàn)形式。
其實(shí)這個(gè)問(wèn)題跟用什么語(yǔ)言導(dǎo)出csv文件沒(méi)有關(guān)系。Excel顯示數(shù)字時(shí),如果數(shù)字大于12位,它會(huì)自動(dòng)轉(zhuǎn)化為科學(xué)計(jì)數(shù)法;如果數(shù)字大于15位,它不僅用于科學(xué)技術(shù)費(fèi)表示,還會(huì)只保留高15位,其他位都變0。
解決這個(gè)問(wèn)題
只要把數(shù)字字段后面加上顯示上看不見(jiàn)的字符即可,字符串結(jié)尾加上制表符"\t".
php 程序可以這樣判斷,注意一定是"\t",不是'\t'.
is_numeric($val)?$val."\t":$val;
以上代碼內(nèi)容就是本文實(shí)現(xiàn)PHP下載生成的csv文件及問(wèn)題總結(jié),希望大家喜歡。
- php導(dǎo)入csv文件碰到亂碼問(wèn)題的解決方法
- 基于PHP讀取csv文件內(nèi)容的詳解
- php使用fgetcsv讀取csv文件出現(xiàn)亂碼的解決方法
- 詳解PHP導(dǎo)入導(dǎo)出CSV文件
- PHP按行讀取、處理較大CSV文件的代碼實(shí)例
- php將csv文件導(dǎo)入到mysql數(shù)據(jù)庫(kù)的方法
- php對(duì)csv文件的讀取,寫入,輸出下載操作詳解
- php中數(shù)據(jù)的批量導(dǎo)入(csv文件)
- php寫入數(shù)據(jù)到CSV文件的方法
- php fputcsv命令 寫csv文件遇到的小問(wèn)題(多維數(shù)組連接符)
- PHP實(shí)現(xiàn)CSV文件的導(dǎo)入和導(dǎo)出類
- php實(shí)現(xiàn)的讀取CSV文件函數(shù)示例
相關(guān)文章
php+ajax實(shí)現(xiàn)文章自動(dòng)保存的方法
這篇文章主要介紹了php+ajax實(shí)現(xiàn)文章自動(dòng)保存的方法,可實(shí)現(xiàn)文章內(nèi)容的實(shí)時(shí)保存,防止突發(fā)情況下的數(shù)據(jù)丟失,是非常實(shí)用的技巧,需要的朋友可以參考下2014-12-12PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法
這篇文章主要介紹了PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法,實(shí)例分析了php解析URL及跳轉(zhuǎn)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03PHP編程求最大公約數(shù)與最小公倍數(shù)的方法示例
這篇文章主要介紹了PHP編程求最大公約數(shù)與最小公倍數(shù)的方法,涉及php數(shù)學(xué)計(jì)算的相關(guān)運(yùn)算技巧,需要的朋友可以參考下2017-05-05php基于數(shù)組函數(shù)實(shí)現(xiàn)關(guān)聯(lián)表的編輯操作示例
這篇文章主要介紹了php基于數(shù)組函數(shù)實(shí)現(xiàn)關(guān)聯(lián)表的編輯操作,涉及php數(shù)組比較函數(shù)array_intersect與array_diff的相關(guān)使用技巧,需要的朋友可以參考下2017-07-07php生成不重復(fù)隨機(jī)數(shù)、數(shù)組的4種方法分享
這篇文章主要介紹了php生成不重復(fù)隨機(jī)數(shù)、數(shù)組的4種方法分享,本文直接給出實(shí)現(xiàn)代碼,并對(duì)生成效率做了對(duì)比,需要的朋友可以參考下2015-03-03