Autor Zpráva
rade.k
Profil *
Ahoj,

mám problém s výpisem dat do XLS souboru. K tvorbě XLS používám pear.php.net/package/Spreadsheet_Excel_Writer. Data jsou uložena v databázi v kódování UTF-8 (utf8_general_ci), web je v UTF-8.

XLS soubor ale požaduje kódování ISO-8859-2 (nevím proč, už jsem s kódováním XLS dokumentu válčil vícekrát a vždy toto kódování vyhrálo).

Nyní mám na stránce, která generuje XLS soubor, následující kód:

<?php

header('Content-Type: text/html; charset=utf-8'); // zde jsem zkousel i iso-8859-2
require_once __DIR__ . '/php_writer.php';
...
$excel = new Spreadsheet_Excel_Writer(__DIR__ . '/file.xls');
$sheet =& $excel->addWorksheet('Sheet');
$sheet->setInputEncoding('ISO-8859-2');

// $sheet->write ma tri parametry - radek, sloupec, hodnota
$sheet->write(0, 0, iconv('UTF-8', 'ISO-8859-2', $val)); // 0,0 je bunka A1
#$sheet->write(0, 0, mb_convert_encoding($val, 'ISO-8859-2', 'UTF-8'));
#$sheet->write(0, 0, str_replace("ř", "\370", $val); // zde jsem mel v poli celou prevodni tabulku pro vsechnu CS diakritiku, "ř" je jako příklad - á,é,í,... mi to převedlo korektně, opět jen 6 znaků vyjmenovaných níže nikoliv. 

Všemi třemi způsoby zápisu do buňky, viz výše, jsem dosáhl správného zobrazení diakritiky, vyjma 6 znaků (ř, Ř, ž, Ž, ť, Ť), místo kterých mi to ukazuje (ľ, ®, ą, ©, », «). Zbylá diakritika je v pořádku. Data jsou skutečně UTF-8, to jsem testoval pomocí mb_detect_encoding, kterou jsem v zápisech výše také zkoušel namísto natvrdo vloženého UTF-8.

Zkoušel jsem i str_replace těch 6 znaků (nahraď pole za pole) po iconvu, čili str_replace(array(...), array(...), iconv(...)), ale beze změny.

Nějaká rada, jak donutit Excel zobrazovat i tyto znaky? Co dělám špatně, proč se mi ostatní diakritika zobrazuje a zrovna tyto znaky ne?

Děkuji.
nightfish
Profil
Na první pohled to vypadá na rozdílné kódování znaků mezi ISO-8859-2 a CP1250.
Zkusil bych buď:
1) $sheet->setInputEncoding('UTF-8');
a data zapisovat v UTF-8

nebo
2) $sheet->setInputEncoding('windows-1250');
a iconv('utf-8', 'windows-1250', $val);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: