Генерация csv или xls на php и кирилица

stifler_x
На сайте с 19.06.2008
Offline
193
7931

День добрый!

Есть задача. Сгенерировать csv или xls файл с данными (в которых может быть кирилица), и отправить в браузер пользователя.

Генерация xls:


class Excel {

var $xls_data;
var $xlsName;

function Excel($filename)
{
$this->xls_data = "";
$this->xlsName = $filename;
$this->_excelStart();
}

function WriteTitle($fields=array()){
if (is_array($fields) && count($fields)){
foreach ($fields as $k => $name) {
$this->WriteValue(0, $k, $name);
}
}
}

function WriteRows($fields=array()){
if (is_array($fields[0])){
foreach ($fields as $i=>$field){
foreach ($field as $k=>$value){
$this->WriteValue($i+1, $k, $value);
}
}
}
else {
foreach ($fields as $k=>$value){
$this->WriteValue(1, $k, $value);
}
}
}


function WriteValue($xls_row, $xls_col, $value)
{
if (is_numeric($value))
$this->WriteCellNumber($xls_row, $xls_col, $value);
else
$this->WriteCellText($xls_row, $xls_col, $value);
}

function OutputFile()
{
$this->_excelEnd();

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");;
header("Content-Disposition: attachment;filename=".$this->xlsName.".xls ");
header("Content-Transfer-Encoding: binary ");

print ($this->xls_data);
}


function _excelStart()
{
$this->xls_data = pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);

}


function _excelEnd()
{
$this->xls_data .= pack("ss", 0x0A, 0x00);
}


function WriteCellNumber($xls_row, $xls_col, $value)
{
settype($value, 'float');
settype($row, 'integer');
settype($col, 'integer');

$this->xls_data .= pack("sssss", 0x0203, 14, $xls_row, $xls_col, 0x00);
$this->xls_data .= pack("d", $value);
}

function WriteCellText($xls_row, $xls_col, $value)
{
settype($value, 'string');
settype($row, 'integer');
settype($col, 'integer');

$len = strlen($value);
if ($len > 255) {
$value = "#STRING TOO LONG:" . $len;
$len = strlen($value);
}
$this->xls_data .= pack("s*", 0x0204, 8 + $len, $xls_row, $xls_col, 0x00, $len);
$this->xls_data .= $value;
}

}

Если $value имеет кирилицу, получаем ячейку с кашей.

Аналогично пытался отдать пользователю csv, и столкнулся с той же проблемой.


class Excel {

var $filename;

var $csv;

var $delimiter = ';';


function Excel ($file){
$this->filename = $file;
$this->csv = '';
}

function WriteTitle($fields=array()){
if (is_array($fields) && count($fields)){

$line = join($fields, $this->delimiter);

$this->csv .= $line.PHP_EOL;
}
}

function WriteRows($fields=array()){
if (is_array($fields) && count($fields)){
if (is_array($fields[0]) && count($fields)){
foreach ($fields as $i =>$field){
$line = join($field, $this->delimiter);
$this->csv .= $line.PHP_EOL;
}
}
else {
$line = join($fields, $this->delimiter);
$this->csv .= $line.PHP_EOL;
}
}
}

function OutputFile(){
if ($this->filename && $this->csv){
$this->SendHeaders();
print $this->csv;
}
}


function SendHeaders(){
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: text/csv");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=".$this->filename.".csv");
}

}

Пробовал обрабатывать данные iconv($CurrentCharset,$ToCharset,$string); но ничего не изменяется.

Посоветуйте, как решить возникшую проблему.

Joker-jar
На сайте с 26.08.2010
Offline
171
#1

На работе писал веб-приложение с экспортом в xls. С кириллицей все ок. Использовал PHPExcel.

stifler_x
На сайте с 19.06.2008
Offline
193
#2

Joker-jar, использовать PHPExcel, нет ни желания, ни возможности.

На сервере не установлена PEAR, и мне не нужен весь функционал PHPExcel, необходимо просто создать файл в несколько полей без стилизации и т.д.

Joker-jar
На сайте с 26.08.2010
Offline
171
#3

С csv должно точно сработать, ведь это обычный текстовый файл. Нужно определить, что желает видеть Excel в нем, cp1251 или же utf-8. Если в скриптах используете юникод, попробуйте кириллицу прогнать через

$str = iconv('utf-8', 'windows-1251', $str)
C
На сайте с 04.02.2005
Offline
291
#4

А вы создайте 3 файла в одну строчку,в формате csv и с разными кодировками

(DOS - 866, WIN - windows-1251, UTF-8)

И попробуйте открыть в Excele двумя способами:

даблкликом

и

Файл открыть - выбрать тип файла - csv

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий