Плагин Questionnaire

Плагин Questionnaire

от Dmitry Lebedev -
Количество ответов: 10

Есть задача выгружать ответы в excel.

Для того, чтобы сменить формат загружаемого файла достаточно в файле report.php поменять в строке header("Content-Disposition: attachment; filename=$name.txt");

.txt на .xls. И всё вроде бы хорошо, за исключением того, что после того, как скачаем - русские символы отображаются не в нужной кодировке. Подскажите, кто сталкивался, где нужно изменить кодировку, чтобы кириллица отображалась верно после скачивания.

В ответ на Dmitry Lebedev

Re: Плагин Questionnaire

от Vadim Tabunshchik -
Изображение пользователя Developers
поменять в строке header … .txt на .xls

И зачем это делать? Расширение файла сделали .txt специально для не англоязычных пользователей Excel (SEP. 2007 JR changed file extension to *.txt for non-English Excel users)
А открывать файл нужно из контекстного меню правой кнопки: "Открыть с помощью…"

В ответ на Vadim Tabunshchik

Re: Плагин Questionnaire

от Dmitry Lebedev -

Задача же стоит - выгружать в excel. txt != xls

Даже если мы скачиваем в txt и открываем с помощью excel'a выходит вот это.


В ответ на Dmitry Lebedev

Re: Плагин Questionnaire

от Vadim Tabunshchik -
Изображение пользователя Developers
Задача же стоит - выгружать в excel. txt != xls

Не нужно мне это объяснять, я это понимаю прекрасно.

Но вы не понимаете, что проблема не в moodle, "лечить" её не нужно, меняя исходный код. Выгрузка в файл проходит как положено - формат CSV, разделитель - табуляция, кодировка UTF-8.

Проблема заключается в Excel, не умеющем нормально работать с UTF-8.

Если вариант "Открыть с помощью" не проходит, нужно идти другим путем: сначала запустите Excel и потом уже в нем выполните "Файл-Открыть-…", т. е., выполните импорт текстового файла, указав кодировку, разделитель, т.п.

После открытия можете сохранять в xls, xlsx, во что угодно.

В ответ на Vadim Tabunshchik

Re: Плагин Questionnaire

от Dmitry Lebedev -
Вадим, однако, я нашел решение улыбаюсь

Изменения в report.php
1. header("Content-Disposition: attachment; filename = $name.xls");
2. header("Content-Type: application/vnd.ms-excel");
3. Далее в цикле foreach после строки:
$text = implode("\t", $row);
Добавляем:
$text = mb_convert_encoding($text, "windows-1251", "utf-8");

Профит.
В ответ на Dmitry Lebedev

Re: Плагин Questionnaire

от Vadim Tabunshchik -
Изображение пользователя Developers
я нашел решение

А теперь ответьте на вопрос, что делать тем, у кого в ОСи используется кодировка НЕ windows-1251? И сколько таких пользователей по сравнению с теми, у кого windows-1251?

В ответ на Vadim Tabunshchik

Re: Плагин Questionnaire

от Dmitry Lebedev -
Решая проблему я искал решение, в первую очередь, для себя, и для своих пользователей, а не для всех с этого форума.


Вы мне сказали, что решения нет, я убедил Вас в обратном.

В ответ на Dmitry Lebedev

Re: Плагин Questionnaire

от Vadim Tabunshchik -
Изображение пользователя Developers

Dmitry, вы меня потролить решили? Покажите, где я сказал, что решения нет?

Решая проблему я искал решение, в первую очередь, для себя, и для своих пользователей, а не для всех с этого форума.

Тогда что вы тут забыли?

В ответ на Vadim Tabunshchik

Re: Плагин Questionnaire

от Dmitry Lebedev -

Vadim, последнее, чем мне хотелось бы заниматься это вас тролить.

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

В ответ на Dmitry Lebedev

Re: Плагин Questionnaire

от Vadim Tabunshchik -
Изображение пользователя Developers

Ладно, проехали. Просто политика "в" и "вокруг" moodle такая, чтобы максимально удовлетворялись потребности всех пользователей системы, а не "в первую очередь, для себя, и для своих пользователей".

Вот, по наводке Вадима Дворовенко, я "прикрутил" экспорт результатов в формат .ods. Пользуйтесь, можете "допилить" при необходимости.

Изменения в questionnaire/report.php (версия плагина 3.0.0 2015102800), ниже строки 526

        $name = preg_replace("/[^A-Z0-9]+/i", "_", trim($name));
        $name .= '.ods';

            $choicecodes = optional_param('choicecodes', '0', PARAM_INT);
            $choicetext  = optional_param('choicetext', '0', PARAM_INT);
            $output = $questionnaire->generate_csv('', $user, $choicecodes, $choicetext, $currentgroupid);
            // CSV
            // SEP. 2007 JR changed file extension to *.txt for non-English Excel users' sake
            // and changed separator to tabulation
            // JAN. 2008 added \r carriage return for better Windows implementation.
            //header("Content-Disposition: attachment; filename=$name.txt");
            //header("Content-Type: text/comma-separated-values");
        require_once($CFG->dirroot.'/lib/odslib.class.php');
        $workbook = new MoodleODSWorkbook("-");
        $workbook->send($name);
        $worksheet = array();
        $worksheet[0] = $workbook->add_worksheet('');
        $rowno = 0;
        foreach ($output as $row) {
        $colno = 0;
        foreach($row as $col) {
            $worksheet[0]->write($rowno, $colno, $col);
            $colno++;
        }
        $rowno++;
    }
    $workbook->close();
    return $name;
        exit();
        break;

Думаю, разберетесь.

В ответ на Dmitry Lebedev

Re: Плагин Questionnaire

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода

Сомнительный профит менять код ради этого. К тому же вы всё-равно всё делаете неправильно.

Выдача идет в формате tsv. Если бы выдача шла в родном формате excel, то не было бы и проблем с кодировкой, поскольку он лучше стандартизирован. Но тут и разработчики модуля накосячили - правильный mime-тип - text/tab-separated-values, расширение - .tsv.

Формат csv/tsv не устанавливает жестких ограничений на разделитель и кодировку, а вот Excel некорректно работает с таким разнообразием. Самое простое из технически-правильных решений тут - поставить LibreOffice и пересохранять им из .csv в .xlsx. Правильное решение с точки зрения удобства пользователей - переписать модуль на выдачу в формате .odt - формат открытый, поэтому легко делается средствами moodle, но при этом открывается в последних версиях excel