2013-06-14 4 views
2

У меня есть строка mysql с utf8_general_ci сортировка, когда я экспортирую ее в csv, вместо правильных символов utf-8 я получаю Ć…ā€¦I и т. Д., Как сделать Excel лучше понять UTF-8 кодирование вот мой код:Экспорт данных из MySQL в 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), а также для поддержания макет таблицы тоже (со строками и столбцами)

+0

Вы можете попробовать установить заголовок спецификации UTF-8, но вы также можете посмотреть на файл реального Excel (BIFF .xls или OfficeOpenXML .xlsx), который устранит такие проблемы, предоставив Excel файлу в собственном формате –

ответ

6

Вы порождающими CSV, который в основном представляет собой текстовый файл. Невозможно указать информацию о кодировании в таких файлах. Большинство текстовых редакторов реализуют (лучше или хуже) автоматическое определение кодировки. Excel не работает. Excel просто примет ANSI, когда вы щелкните правой кнопкой мыши файл CSV. (Вам нужно использовать меню «Открыть», чтобы получить подсказку о кодировке.)

Ваш единственный вариант (кроме перехода на другой формат вывода) - преобразование данных в ANSI либо с mb_convert_encoding(), либо с iconv(). Но теперь у вас есть еще одна проблема: ANSI - это не настоящая кодировка, она в основном означает «независимо от того, какая кодировка установлена ​​в my Windows computer». Сначала вам нужно узнать типичную кодировку, которой пользуются большинство ваших пользователей. Это в основном зависит от страны. Например, многие страны Западной Европы используют Win-1252.

+1

Спасибо за информацию. Я закончил использование phpexcel для создания файла xls - никаких проблем нет http://phpexcel.codeplex.com/wikipage?title=Examples&referringTitle=Home – fjckls

0

В качестве альтернативного и много решения sipmler вы можете попробовать это, я использую его в течение нескольких лет и никогда не имел проблемы с ним.

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') 
2

Я была такая же проблема (общая проблема в базах данных с испанского языка). Я написал это, и он сработал:

Это класс, который соединяется с базой данных, и функции будут делать то, что вы хотите, используя mysqli и PHP. В этом случае, вызывая этот класс (require или include), просто используйте функцию «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.

Я надеюсь, что это поможет вам, я думаю, что написал это хорошо, мне не понравилось текстовое поле и поле кода.

Смежные вопросы