php產生csv檔案並下載及問題總結

來源:互聯網
上載者:User

例子,產生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;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.