0

我有一个接受用户注册及其详细信息等的数据库设置。我希望使用 php 将数据库导出到 excel 文件。

我遇到的问题是一些参赛者输入了外国字符,例如土耳其语,它已“错误地”写入数据库 - 据我所知,字符集可能在第一次时设置不正确制作。

我已经编写了将数据库导出到 excel 中的代码(如下),但是无论我如何尝试对数据进行编码,我都无法正确显示 Excel 文档

<?php 

require_once('../php/db.php');

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=Download.xls");
header("Pragma: no-cache");
header("Expires: 0");

$query =    "SELECT * FROM users";

$result = mysqli_query($link, $query);
if($result) {
    $count = mysqli_num_rows($result);
    for($i=0; $i<$count; $i++) {
        $field = mysqli_fetch_field($result);
        $header .= $field->name."\t";
        while($row = mysqli_fetch_row($result)) {
            $line = '';
            foreach($row as $value) {
                if((!isset($value)) OR ($value == "")) {
                    $value = "\t";
                } else {
                    $value = str_replace('"', '""', $value);
                    $value = '"'.$value.'"'."\t";
                }
                $line .= $value;
            }
            $data .= trim($line)."\n";
        }
        $data = str_replace("\r", "", $data);
        if($data == "") {
            $data = "\n(0) Records Found!\n";
        }
    }
    print mb_convert_encoding("$header\n$data", 'UTF-16LE', 'UTF-8');
} else die(mysqli_error());
?>

当我这样做时,它在打开它时出现错误,说 Excel 无法识别文件类型,它会打开文档,但它在它试图写入的所有土耳其语字符周围绘制了框。

我不是 PHP 专家,这只是我拼凑的信息。

谁能帮我一把?

非常感激

莫兹

4

1 回答 1

2
  1. 首先,您似乎正在创建一个制表符分隔的文本文件,然后使用 MIME 类型application/octet-stream和文件扩展名将其返回给浏览器.xls。Excel 可能会发现它是制表符分隔的(但从你的错误中听起来好像没有),但无论如何你真的应该使用text/tab-separated-valuesMIME 类型和.txt文件扩展名,以便一切都知道数据是什么。

  2. 其次,要创建制表符分隔的文件,您最好直接从 MySQL 导出数据(使用SELECT ... INTO OUTFILE),因为当您尝试自己进行转义分隔符等时,会出现各种痛苦。例如:

    SELECT * FROM users INTO OUFILE '/tmp/users.txt' FIELDS TERMINATED BY '\t'
    

    然后,您只需要使用readfile().

    如果您绝对必须从 PHP 中创建分隔文件,请考虑使用它的fputscsv()函数(您仍然可以指定您希望使用制表符分隔符)。

  3. 始终使用.txt文件扩展名,而不是.csv 即使您的文件以逗号分隔,因为某些版本的 Excel 假定所有具有.csv扩展名的文件都使用Windows-1252.

  4. As far as character encodings go, you will need to inspect the contents of your database to determine whether data is stored correctly or not: the best way to do this is to SELECT HEX(column) ... in order that you can inspect the underlying bytes. Once that has been determined, you can UPDATE the records if conversions are required.

于 2012-05-17T14:56:24.373 回答