Я работаю с приложением на базе yii. Моя цель - написать действие контроллера, которое экспортирует некоторые данные из mongodb в файл csv, используя Yii 1.1: csvexport и CHttpRequest::sendFile

Мой код:

public function actionCatalogDataExport( $catalog_id )
{
    // prepare all needed variables here
    $data = ..., $headers = ..., $filename = ...     

    Yii::import('ext.csv.ECSVExport');
    $csv = new ECSVExport($data);
    $output = $csv->setHeaders($headers)->setDelimiter(',')->toCSV();
    Yii::app()->getRequest()->sendFile($filename, $output, "text/csv", true);
}

Этот скрипт работает правильно, но если я открою получившийся файл через Excel, я увижу что-то вроде этого:

enter image description here

Есть некоторые проблемы с кодировкой файлов ... Я открыл блокнот ++ и изменил кодировку на UTF-8 без спецификации, теперь файл выглядит хорошо (язык: Ru):

enter image description here

Проверены эти исправления, но безуспешно:

header('Content-type: text/csv; charset=UTF-8'); // no effect

Yii::app()->getRequest()->sendFile(
    $filename, 
    $output, 
    "text/csv; charset=UTF-8", // no effect
    true
);

Как я могу добиться этого сразу после действия yii send file?

2
itnelo 16 Июл 2014 в 12:19

2 ответа

Лучший ответ

По умолчанию в параметрах настройки Excel для Windows открывает файлы csv в кодировке windows-1251. Если мне нужно сделать правильные значения данных с помощью этой кодировки, я должен использовать iconv

foreach( $data as $key => &$value ) {
    $value = iconv('UTF-8', 'windows-1251', $value);
}

// send file to user...
// ...and it works as I need.
0
itnelo 16 Июл 2014 в 14:23

Попробуйте добавить код в начало файла csv следующим образом:

$encode = "\xEF\xBB\xBF"; // UTF-8 BOM
$content = $encode . $csv->toCSV();

//var_dump($content);
Yii::app()->getRequest()->sendFile($filename, $content, "text/csv; charset=UTF-8", false);
1
TotPeRo 17 Июл 2014 в 20:09