I had the same problem (common problem in databases with spanish language). I wrote this and it worked:
This is a Class that connects with the database and the functions will do whatever you want using mysqli and PHP. In this case, calling this class (require or include), just use the «downloadCsv()» function.
As an example, this would be the «class.php» file:
<?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 foundn";
}
$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";
}
?>
After creating the «class.php» file, in this example, use that function on «download.php» file:
<?php
//call the "class.php" file
require_once 'class.php';
//instantiate DB class
$export = new DB();
//call function
$export->downloadCsv();
?>
After download, open the file with MS Excel.
I hope this help you, I think I wrote it well, I didn’t feel comfortable with the text and code field.
Если нужно быстро и единоразово выгрузить данные из таблицы MySQL в Exel файл, то помогут следующие способы:
1
Экспорт через PHPMyAdmin
В PHPMyAdmin при экспорте можно выбрать формат «CSV for MS Excel»:
При открытии полученного файла в Excel будет сбита кодировка:
Чтобы это исправить, нужно открыть csv файл в редакторе типа Notepad++ и изменить кодировку на ANSI:
Результат:
2
Экспорт через HTML таблицу
Смысл метода состоит в том чтобы PHP-скриптом сформировать HTML таблицу:
<?php
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `test`");
$sth->execute();
$items = $sth->fetchAll(PDO::FETCH_ASSOC);
?>
<table>
<tr>
<td>ID</td>
<td>Категория</td>
<td>Название</td>
<td>Описание</td>
</tr>
<?php foreach($items as $row): ?>
<tr>
<td><?php echo $row['id']; ?></td>
<td><?php echo $row['category']; ?></td>
<td><?php echo $row['name']; ?></td>
<td><?php echo $row['text']; ?></td>
</tr>
<?php endforeach; ?>
</table>
PHP
Результат работы скрипта:
Полученную таблицу копируем и вставляем в чистый лист Microsoft Exel:
3
Экспорт через PHPExcel
Третий метод – сформировать xls-файл в библиотеке PHPExcel (PHPExcel.zip).
//spl_autoload_unregister('autoload');
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel.php';
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel/Writer/Excel2007.php';
$xls = new PHPExcel();
$xls->setActiveSheetIndex(0);
$sheet = $xls->getActiveSheet();
// Шапка
$sheet->getStyle("A1:D1")->getFont()->setBold(true);
$sheet->setCellValue("A1", 'ID');
$sheet->setCellValue("B1", 'Категория');
$sheet->setCellValue("C1", 'Название');
$sheet->setCellValue("D1", 'Описание');
// Выборка из БД
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `test`");
$items = $sth->fetch(PDO::FETCH_ASSOC);
$index = 2;
foreach ($items as $row) {
$sheet->setCellValue("A" . $index, $row['id']);
$sheet->setCellValue("B" . $index, $row['category']);
$sheet->setCellValue("C" . $index, $row['name']);
$sheet->setCellValue("D" . $index, $row['name']);
$index++;
}
// Отдача файла в браузер
header("Expires: Mon, 1 Apr 1974 05:00:00 GMT");
header("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-type: application/vnd.ms-excel" );
header("Content-Disposition: attachment; filename=prods.xlsx");
$objWriter = new PHPExcel_Writer_Excel2007($xls);
$objWriter->save('php://output');
exit();
PHP
Результат:
5 / 5 / 3 Регистрация: 19.09.2013 Сообщений: 303 |
|
1 |
|
01.02.2014, 14:12. Показов 13016. Ответов 6
Экспортирую таблицу из mysql в «csv для excel», таблица кодировкой utf8, база тоже, столбцы где есть русские буквы имеют сравнение utf8_general_ci (что это такое кстати?), тип таблиц InnoDB. в блокноте все норм отображает, в экселе кракозябры. в экселе в параметрах веб-документа поставил Юникод. что можно сделать?
0 |
5 / 5 / 3 Регистрация: 19.09.2013 Сообщений: 303 |
|
03.02.2014, 14:41 [ТС] |
2 |
Ребят помогите с кракозябрами. в экселе нормально текст не хочет выводиться. из пхпМайАдмина делаю экспорт, в блокноте норм выводит, в экселе нет
0 |
813 / 796 / 201 Регистрация: 21.09.2012 Сообщений: 2,656 |
|
03.02.2014, 14:48 |
3 |
вручную если только изменять с помощью Notepad++ кодировку на cp1251
0 |
5 / 5 / 3 Регистрация: 19.09.2013 Сообщений: 303 |
|
03.02.2014, 14:58 [ТС] |
4 |
Dolphin, а может тогда лучше базу в cp-1251 перевести, эт поможет? а в соединение с базой вот это написать mysql_query(‘set names utf8’); ?
0 |
813 / 796 / 201 Регистрация: 21.09.2012 Сообщений: 2,656 |
|
03.02.2014, 15:00 |
5 |
А нет, сначало переключаешь на показ всеx настроек. А потом выбираешь кодировку, в которой будет получившийся файл. А именно windows-1251
1 |
5 / 5 / 3 Регистрация: 19.09.2013 Сообщений: 303 |
|
03.02.2014, 15:02 [ТС] |
6 |
Dolphin, спасибо тебе) работает.
0 |
1177 / 419 / 106 Регистрация: 31.03.2012 Сообщений: 1,138 |
|
03.02.2014, 15:13 |
7 |
Здесь обрати внимание на select … into outfile ‘file_name‘ character set chaset_name. Вероятно, стоит указать cp1251
0 |
I try to export one of MySQL table into excel file but polish letters aren’t displaying correctly
It is displayed:
Bre¶ć, Białoru¶
but should:
Brześć, Białoruś
How can I fix this code? It is really anoying that polish letters aren’t displayed. Where could be a problem?
<?php
$DB_Server = "localhost"; //your MySQL Server
$DB_Username = "******"; //your MySQL User Name
$DB_Password = "*****"; //your MySQL Password
$DB_DBName = "*******"; //your MySQL Database Name
$DB_TBLName = "********"; //your MySQL Table Name
$filename = "excelfilename"; //File Name
//create MySQL connection
$sql = "Select * from $DB_TBLName";
$Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password)
or die("Couldn't connect to MySQL:<br>" . mysql_error() . "<br>" . mysql_errno());
//select database
$Db = @mysql_select_db($DB_DBName, $Connect)
or die("Couldn't select database:<br>" . mysql_error(). "<br>" . mysql_errno());
//execute query
$result = @mysql_query($sql,$Connect)
or die("Couldn't execute query:<br>" . mysql_error(). "<br>" . mysql_errno());
$file_ending = "xls";
//header info for browser
header("Content-Type: application/xls");
header("Content-Disposition: attachment; filename=$filename.xls");
header("Pragma: no-cache");
header("Expires: 0");
/*******Start of Formatting for Excel*******/
//define separator (defines columns in excel & tabs in word)
$sep = "t"; //tabbed character
//start of printing column names as names of MySQL fields
for ($i = 0; $i < mysql_num_fields($result); $i++) {
echo mysql_field_name($result,$i) . "t";
}
print("n");
//end of printing column names
//start while loop to get data
while($row = mysql_fetch_row($result))
{
$schema_insert = "";
for($j=0; $j<mysql_num_fields($result);$j++)
{
if(!isset($row[$j]))
$schema_insert .= "NULL".$sep;
elseif ($row[$j] != "")
$schema_insert .= "$row[$j]".$sep;
else
$schema_insert .= "".$sep;
}
$schema_insert = str_replace($sep."$", "", $schema_insert);
$schema_insert = preg_replace("/rn|nr|n|r/", " ", $schema_insert);
$schema_insert .= "t";
print(trim($schema_insert));
print "n";
}
?>
asked Aug 6, 2014 at 13:50
6
You have to write what is charset of you database. If it is UTF8 try to execute query «SET NAMES utf8» after connection is established ;
And be shure that encoding of you page is UTF8. You can check encoding in Notepad++ utility
answered Aug 6, 2014 at 15:02
Problem is your output is in ISO-8859-2
but excel expects Windows-1250
which has few characters shuffled around for Windows-1252
compatibility.
You can either convert your output to Windows-1250
echo mb_convert_encoding($str, 'Windows-1250', 'ISO-8859-2');
Or convert to utf8:
add utf8 BOM after headers and first thing as file content:
echo "xEFxBBxBF";
and convert data to utf8
echo mb_convert_encoding($str, 'UTF-8', 'ISO-8859-2');
If you have older excel that does not support utf8 you are out of luck.
By default excel assumes windows default locale which is different for people from different locations i.e person in US will likely see your text as «Brze¶æ, Bia³oru¶» instead
answered Aug 6, 2014 at 15:58
Imre LImre L
6,13923 silver badges32 bronze badges
1
-
#1
Проблема с кодировкой при импорте Excel в mySQL
Использую скрипт «Zakkis Php Excel Parser Pro v4.0» для формирования БД из excel-файла. Проблема состоит в том, что русские символы записываются в mySQL в виде кодов (вида &#XXX). Как я понимаю, проблема состоит в том, что данные в excel хранятся в unicode. У меня же в БД задана кодировка CP1251. При извлечении из БД в браузере русские символы отображаются коррекно, но они также заданы кодами. Очень хотелось бы узнать, как справиться с этой проблемой, т.е. как заносить данные в БД в нормальной кодировке.
Версия php: 4.3.10
Версия mysql: 4.1.8
Заранее спасибо за помощь!
-
#2
известная фича.
PHP:
$str=iconv('UNICODELITTLE','UTF-8',$str);
вместо UTF-8 поставить то, что нужно.