MySQL到Excel的charset问题

时间:2012-05-17 14:30:25

标签: php mysql excel export mysqli

我有一个数据库设置,接受用户注册及其详细信息等。我希望使用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专家,这只是我拼凑的信息。

任何人都可以帮我一把吗?

非常感谢

盎司

1 个答案:

答案 0 :(得分:2)

  1. 首先,您似乎正在创建制表符分隔的文本文件,然后将其返回到MIME类型为application/octet-stream且文件扩展名为.xls的浏览器。 Excel可能会以制表符分隔(但它听起来像你的错误,好像它没有),但无论如何你真的应该使用text/tab-separated-values MIME类型和.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会假设 all <扩展名为.csv的/ em>文件使用Windows-1252进行编码。

  4. 就字符编码而言,您需要检查数据库的内容以确定数据是否正确存储:执行此操作的最佳方法是SELECT HEX(column) ...以便您可以检查底层字节。确定后,如果需要转换,您可以UPDATE记录。