【问题标题】:Export data from MySQL to Excel with UTF-8 encoding使用 UTF-8 编码将数据从 MySQL 导出到 Excel
【发布时间】:2013-06-11 02:07:58
【问题描述】:

我有一个带有utf8_general_ci排序规则的mysql行,当我将它导出到csv时,我得到Å…I等,而不是正确的utf-8字符,如何让excel理解UTF-8编码是我的代码:

$conn = mysql_connect('localhost', 'root', 'asdfggh') or die(mysql_error());
mysql_query("SET CHARACTER SET utf8"); 
mysql_query("SET NAMES utf8"); 
mysql_select_db('table_name', $conn) or die(mysql_error($conn));

$query = sprintf('SELECT * FROM sudraba_birzs');
$result = mysql_query($query, $conn) or die(mysql_error($conn));

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="'.date("d-m-Y_H:i") . '.csv'.'"'); 
echo "\xef\xbb\xbf";

$row = mysql_fetch_assoc($result);
if ($row) {
    echocsv(array_keys($row));
}

while ($row) {
    echocsv($row);
    $row = mysql_fetch_assoc($result);
}

function echocsv($fields)
{
    $separator = '';
    foreach ($fields as $field) {
        if (preg_match('/\\r|\\n|,|"/', $field)) {
            $field = '"' . str_replace('"', '""', $field) . '"';
        }
        echo $separator . $field;
        $separator = ',';
    }
    echo "\r\n";
}

如何导出它以正确显示所有字符(使 Excel 理解 utf-8)并保持表格布局(行和列)

【问题讨论】:

  • 您可以尝试设置 UTF-8 BOM 标头,但您也可以考虑编写一个真正的 Excel 文件(BIFF .xls 或 OfficeOpenXML .xlsx),通过向 Excel 提供文件来消除此类问题以其原始格式

标签: php mysql excel csv


【解决方案1】:

您正在生成 CSV,它基本上是一个纯文本文件。无法在此类文件中指定编码信息。大多数文本编辑器实现(更好或更差)编码自动检测。 Excel 没有。当您右键单击 CSV 文件时,Excel 将简单地假定为 ANSI。 (您需要使用“打开”菜单才能收到有关编码的提示。)

剩下的唯一选择(除了切换到另一种输出格式)是将数据转换为 ANSI,使用mb_convert_encoding()iconv()。但是现在你有另一个问题:ANSI 不是真正的编码,它基本上意味着“在 my Windows 计算机中设置的任何编码”。您首先必须找出大多数用户使用的典型编码。这主要取决于国家。例如,许多西欧国家使用 Win-1252。

【讨论】:

【解决方案2】:

我遇到了同样的问题(西班牙语数据库中的常见问题)。我写了这个并且成功了:

这是一个连接数据库的类,函数将使用 mysqli 和 PHP 做任何你想做的事情。在这种情况下,调用这个类(需要或包含),只需使用“downloadCsv()”函数即可。

例如,这将是“class.php”文件:

<?php
class DB{

private $con;

//this constructor connects with the database
public function __construct(){
$this->con = new mysqli("Your_Host","Your_User","Your_Pass","Your_DatabaseName");

if($this->con->connect_errno > 0){
    die('There was a problem [' . $con->connect_error . ']');
    }
}

//create the function that will download a csv file from a mysqli query

public function downloadCsv(){

$count = 0;
$header = "";
$data = "";
//query
$result = $this->con->query("SELECT * FROM Your_TableName");
//count fields
$count = $result->field_count;
//columns names
$names = $result->fetch_fields();
//put column names into header
foreach($names as $value) {
    $header .= $value->name.";";
    }
}
//put rows from your query
while($row = $result->fetch_row())  {
    $line = '';
    foreach($row as $value)       {
        if(!isset($value) || $value == "")  {
            $value = ";"; //in this case, ";" separates columns
    } else {
            $value = str_replace('"', '""', $value);
            $value = '"' . $value . '"' . ";"; //if you change the separator before, change this ";" too
        }
        $line .= $value;
    } //end foreach
    $data .= trim($line)."\n";
} //end while
//avoiding problems with data that includes "\r"
$data = str_replace("\r", "", $data);
//if empty query
if ($data == "") {
    $data = "\nno matching records found\n";
}
$count = $result->field_count;

//Download csv file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=FILENAME.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo $header."\n".$data."\n";

}
?>

创建“class.php”文件后,在本例中,在“download.php”文件中使用该函数:

<?php
//call the "class.php" file
require_once 'class.php';
//instantiate DB class
$export = new DB();
//call function
$export->downloadCsv();
?>

下载后,用MS Excel打开文件。

希望对你有帮助,我觉得我写的不错,对文本和代码字段感觉不太舒服。

【讨论】:

    【解决方案3】:

    作为一个替代的和更简单的解决方案,你可以试试这个,我已经用了几年了,从来没有遇到过问题。

    db_connect.php

    <?php
    $mysqli = new mysqli($mysqli_host, $mysqli_user, $mysqli_pass, $mysqli_db);
    if ($mysqli->connect_errno)
        {
        $debug = $debug.'<br/>Failed to connect to MySQL: (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error;
        }
    else
        {
        $debug = $debug.'<br/>Connected to '. $mysqli->host_info;
        }
    ?>
    

    导出函数

    function export($query_exp,$name)
        {
        require '../lib/db_config.php';
        require '../lib/db_connect.php';
    
        $filename = $name.' - '.date('Y.m.d').'.xls'; /*set desired output file name here*/
    
        function cleanData(&$str)
                    {
                        $str = preg_replace("/\t/", "\\t", $str);
                        $str = preg_replace("/\r?\n/", "\\n", $str);
                        if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
                        if ($str=='') {$str='-';}
                    }
    
        header("Content-Disposition: attachment; filename=\"$filename\"");
        header("Content-Type: application/vnd.ms-excel");
    
        $flag = false;
    
        if ($result = $mysqli->query($query_exp))
                {
                if ($result->num_rows>0)
                    {
                    $result->data_seek(0);
                    while ($row = $result->fetch_assoc())
                        {
                        if(!$flag)
                            {
                            print implode("\t", array_keys($row)) . "\r\n";
                            $flag = true;
                            }
                        array_walk($row, 'cleanData');
                        print implode("\t", array_values($row)) . "\r\n";
                        }
                    }
                else { $debug = $debug.'<br/>Empty result'; /*DEBUG*/ }
                }
        else { $debug = $debug.'<br/>Oups, Query error!<br/>Query: '.$query_exp.'<br/>Error: '.$mysqli->error.'.'; /*DEBUG*/ }
    
        require '../lib/db_disconnect.php';
        }
    

    您可以将函数调用为:

    export('SELECT * FROM SAMPLE WHERE 1;','desired_file_name.extension')
    

    【讨论】:

      猜你喜欢
      • 2014-11-02
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 2018-01-27
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多