簡體   English   中英

為 Excel 導出 CSV

[英]Export CSV for Excel

我正在使用fputcsv($file, $data)在 PHP 中編寫一個 CSV 文件。 一切正常,但是我不能只在 Excel 中打開它,而是必須導入它並指定編碼和要使用的分隔符(在向導中)。 我已經看到其他網站的導出,只需單擊它們即可正確打開,現在想知道我應該對我的文件做什么才能實現這一目標。

我嘗試使用這個庫: http : //code.google.com/p/parsecsv-for-php/但我什至無法讓它運行,我也不確定它是否真的能幫助我......

這就是我從 PHP 制作 Excel 可讀 CSV 文件的方法:

  • 添加 BOM 以修復 Excel 中的 UTF-8
  • 將分號 (;) 設置為分隔符
  • 設置正確的標題 ("Content-Type: text/csv; charset=utf-8")

舉個例子 :

$headers = array('Lastname :', 'Firstname :');
$rows = array(
    array('Doe', 'John'),
    array('Schlüter', 'Rudy'),
    array('Alvarez', 'Niño')
);

// Create file and make it writable

$file = fopen('file.csv', 'w');

// Add BOM to fix UTF-8 in Excel

fputs($file, $bom = (chr(0xEF) . chr(0xBB) . chr(0xBF)));

// Headers
// Set ";" as delimiter

fputcsv($file, $headers, ";");

// Rows
// Set ";" as delimiter

foreach ($rows as $row) {

    fputcsv($file, $row, ";");
}

// Close file

fclose($file);

// Send file to browser for download

$dest_file = 'file.csv';
$file_size = filesize($dest_file);

header("Content-Type: text/csv; charset=utf-8");
header("Content-disposition: attachment; filename=\"file.csv\"");
header("Content-Length: " . $file_size);
readfile($dest_file);

適用於 Excel 2013。

這真是一團糟。 你當然可以使用 sep=; 或 sep= 或 sep=\\t 或任何使 Excel 知道您的 CSV 中使用的分隔符的東西。 只需將此字符串放在 CSV 內容的開頭即可。 例如:

fwrite($handle, "sep=,\n");

fputcsv($handle,$yourcsvcontent);

這工作順利。 但是,如果您需要分別支持特殊字符或 MB,它不能與使 Excel 知道 UTF-8 所需的 BOM 結合使用。

最后,要使其防彈,您需要讀出用戶區域設置並相應地設置分隔符,如上所述。 在 CSV 內容的("\\xEF\\xBB\\xBF")放置一個 BOM ("\\xEF\\xBB\\xBF") ,然后像這樣編寫 CSV: fputcsv($handle, $fields, $user_locale_seperator); 其中$user_locale_seperator是您通過檢查用戶的語言環境檢索到的分隔符。 不舒服,但它有效......

盡管 CVS 中有“C=逗號”,但 Excel 使用您的語言環境本機分隔符。 因此,假設fputcsv始終使用逗號,如果您的區域設置分隔符是分號,則它將不起作用。

當您點擊“導出到 Excel CSV”時,Google AdSense 的作用是使用Tab作為分隔符。 這有效。

要復制它,請設置fputcsv的第三個參數 ( delimiter ) 以覆蓋默認逗號。 例如對於Tab使用: fputcsv($handle, $fields, "\\t");

將適用於您的 CSV 格式與fputcsv生成的格式進行比較。

考慮在您的問題中包含兩者的示例。 你可能會得到更好的答案。

我注意到你需要考慮: Content-Type header BOM (Byte Order Mark) 文件中的實際字符編碼

使用 BOM(作品):

$bom = pack("CCC", 0xEF, 0xBB, 0xBF);
header('Content-Type: text/csv');
header('Content-Length: '.(strlen($csv)+strlen($bom)));
header('Content-Disposition: attachment;filename=my.csv');
echo $bom;
echo $csv;

沒有 BOM(有效,但您需要替換“智能引號”,然后在每個值或單元格上運行utf8_decode ,它會轉換一些字符,例如 FRĒ 被轉換為 FRE')

header('Content-Type: application/csv;charset=utf-8');
header('Content-Length: '.strlen($csv));
header('Content-Disposition: attachment;filename=my.csv');
echo $csv;

如果使用了錯誤的字符集和 BOM 組合,在 MS Excel 中打開時就會出錯。

額外的事實: mb_strlen告訴您字符數, strlen告訴您字節數。 希望使用mb_strlen計算Content-Length頭。

獎勵 2:替換微軟的“智能”字符(破折號、卷曲引號等):

$map = array(chr(145) => "'"
            ,chr(146) => "'"
            ,chr(147) => '"'
            ,chr(148) => '"'
            ,chr(149) => '-'
            ,chr(150) => '-'
            ,chr(151) => '-'
            ,chr(152) => '-'
            ,chr(152) => '-'
            ,chr(171) => '-'
            ,chr(187) => '-'
);
// faster that strtr
return str_replace( array_keys($map), $map, $str );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM