PHP生成Excel/CSV文件并以UTF-8格式发送


PHP generate Excel/CSV file and send as UTF-8

我从我的Postgres数据库在UTF-8检索数据。db和client_connection的设置是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

我会考虑使用PHPExcel引擎。它使用UTF-8作为默认值,它可以生成一个完整的电子表格文件类型列表(Excel, OpenOffice, CSV等)。

我建议不要发送纯文本并将其伪装成Excel。XLS文件通常是二进制文件,虽然二进制不是必需的,但使用非二进制数据的官方Excel方法是将其格式化为XML。

你在标题中提到了"CSV",但你的问题中没有任何与CSV相关的内容。我提出这个是因为我认为你应该把你的制表符改为逗号,然后你可以简单地输出一个标准的。csv文件,它仍然可以被Excel读取,但不依赖于未记录或不稳定的功能。

如果你真的想发送application/msexcel,那么你应该使用一个真正的Excel库,因为目前,你正在而不是创建一个真正的Excel文件。

使用;charset=UTF-8后应用程序/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"');

尝试mb_convert_encoding函数

尝试使用iconv,将字符串转换为所需的字符集

您是否尝试过utf8_encode()字符串?

例如:echo implode("'t", utf8_encode($cols)."'r'n")

不知道这是否可行,但不妨试试