[英]Export CSV for Excel
我正在使用fputcsv($file, $data)
在 PHP 中編寫一個 CSV 文件。 一切正常,但是我不能只在 Excel 中打開它,而是必須導入它並指定編碼和要使用的分隔符(在向導中)。 我已經看到其他網站的導出,只需單擊它們即可正確打開,現在想知道我應該對我的文件做什么才能實現這一目標。
我嘗試使用這個庫: http : //code.google.com/p/parsecsv-for-php/但我什至無法讓它運行,我也不確定它是否真的能幫助我......
這就是我從 PHP 制作 Excel 可讀 CSV 文件的方法:
舉個例子 :
$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.