2011-10-04 15 views
2

我從UTF-8的Postgres數據庫中檢索數據。 db和client_connection設置是UTF-8。PHP生成Excel/CSV文件並以UTF-8發送

然後我發送2頭向訪問者:

header("Content-Type: application/msexcel"); 
header("Content-Disposition: $mode; filename=export.xls"); 

,並開始在CSV-方式輸出明文數據。這將作爲訪問者桌面上的簡單Excel文件打開。

$cols = array ("col1", "col2", "col3"); 
echo implode("\t", $cols)."\r\n"; 

工作正常,直到遇到像é,è等特殊字符。

我試圖改變我的CLIENT_ENCODING而從分貝的Latin-1,在大多數情況下,但不是所有的字符作品檢索數據。所以這不是一個解決方案。

我怎麼能發送輸出文件爲UTF-8?我不認爲將數據從db轉換爲latin-1是可能的,因爲char在latin-1中似乎是未知的...所以我需要Excel將文件視爲UTF-8

回答

2

我會考慮使用PHPExcel engine。它使用UTF-8作爲默認值,它可以生成電子表格文件類型(Excel,OpenOffice,CSV等)的整個列表。

0

嘗試使用iconv ,用於將字符串轉換爲所需的字符集。

0

嘗試mb_convert_encoding功能。

+0

WebFlakeStudio:不在身邊可能的另一種方式:發送某些頭這樣Excel將知道它是打開該文件爲UTF-8? – user410932

+0

@ user410932:否。使用HTTP傳輸文件,然後通過常規方式打開文件 - Excel不會下載文件,HTTP頭將無法訪問。 – Piskvor

0

你試過函數utf8_encode()的字符串?

因此,像:echo implode("\t", utf8_encode($cols)."\r\n")如果

不知道這會的工作,但給它一個去

+0

除非你試圖對整個文件進行編碼,否則它將無法工作 – DarkMantis

1

我建議不發送純文本和僞裝它爲Excel。 XLS文件通常是二進制文件,雖然不需要二進制文件,但使用非二進制數據的官方Excel方法是將其格式化爲XML

您在標題註明「CSV」,但沒有關於您的問題包括與CSV什麼。我提出這個問題是因爲我相信你應該改變你的標籤爲逗號,然後你可以簡單地輸出一個標準的.csv文件,這個文件可以被Excel讀取,但不依賴於無證或不穩定的功能。

如果你真的想發送application/msexcel,那麼你應該使用一個真正的Excel庫,因爲目前,你是而不是創建一個真正的Excel文件。

+0

的確如此,還有一個庫可以處理Excel文件,例如http://code.google.com/p/php-excel/和事實上,我確信那裏可能有數百個。有一個本地PHP,但它只能在Windows服務器上運行,但我不記得它的名字:/ – DarkMantis

+0

我知道,我生成TSV文件而不是CSV文件,但結果是一樣的:它是一個純文本文件,數據由分隔符分隔。我把它當作XLS進行了掩飾,所以訪問者的桌面將適當地打開文件,而不是在Txt編輯器中或類似的東西。這沒問題,直到你的輸出包含一些特殊字符。 – user410932

+0

這不是僞裝成.xls的正當理由; Excel將自己設置爲.csv文件的默認應用程序。 – ken

1

使用;字符集= UTF-8 aplication後/ XXXXXX我使用:

header("Content-Type: application/vnd.ms-excel; charset=UTF-8"); 
// header("Content-Length: " . strlen($thecontent));  // this is not mandatory 
    header('Content-Disposition: attachment; filename="file.xls"');