フィードバックモジュールでアンケート結果をExcel形式で保存したら,漢字コード(問題と入力データ)が文字化けしました.
Moodle1.8.2+ Feedback19 正常 このデータをxmlで保存
Moodle1.7.2 Feedback17 文字化け 上記のxmlデータをインポート 表示は正常
ただし,新しいバージョンで作成したアンケートデータのxmlをインポートしています.
漢字コードを変換する簡単な方法は,ないでしょうか?
feedbackモジュールの話ではないのですが.
$workbook->setVersion(8);
を
$workbook->setVersion(10);
とする話に関して.
lib/excelclass.lib.php中,function MoodleExcelWorkbook($filename) の中にも同じsetVersion(8)があります.これをsetVersion(10)にすると評定のダウンロードでExcelファイルの中身が文字化けします.その反面,どんなに頑張ってもうまくいかなかったワークシート名(=’評定’)が,
grade/lib.php中の
$myxls =& $workbook->add_worksheet($strgrades);
を
$myxls =& $workbook->add_worksheet(mb_convert_encoding($strgrades, 'SJIS-WIN'));
とすると,化けなくなりました.
setVersion()とMS-Office内部文字コードとの間に関係がありそうな気がします.プログラム中のコメントには,UTF-16LEに変換しなければいかん,
/// Prepare it to accept UTF-16LE data and to encode it properly
ものもあります.てっきりUTF-8なのだと思っていたのですが,Moodleの内部でUTF-8からUTF-16LEに変換していたのですね.
関わりのありそうなクラスを以下に示します.(lib/excellib.php, Moodle1.8.3+)
/**
* Define and operate over one Moodle Workbook.
*
* A big part of this class acts as a wrapper over the PEAR
* Spreadsheet_Excel_Writer_Workbook and OLE libraries
* maintaining Moodle functions isolated from underlying code.
*/
class MoodleExcelWorkbook {var $pear_excel_workbook;
var $latin_output;/* Constructs one Moodle Workbook.
* @param string $filename The name of the file
*/
function MoodleExcelWorkbook($filename) {
global $CFG;
/// Internally, create one PEAR Spreadsheet_Excel_Writer_Workbook class
$this->pear_excel_workbook = new Spreadsheet_Excel_Writer($filename);
/// Prepare it to accept UTF-16LE data and to encode it properly
if (empty($CFG->excelisofiles) && empty($CFG->latinexcelexport)) { /// Only if don't want to use latin (win1252) stronger output
$this->pear_excel_workbook->setVersion(8);
$this->latin_output = false;
} else { /// We want latin (win1252) output
$this->latin_output = true;
}
/// Choose our temporary directory - see MDL-7176, found by paulo.matos
make_upload_directory('temp/excel', false);
$this->pear_excel_workbook->setTempDir($CFG->dataroot.'/temp/excel');
}
”課題の評定”や”小テストの受験結果等”はこちらを利用してExcelファイルを作成しているようです.山田さんの問題3(Excelファイルの中身が文字化け)も,関わりがありそうです.気になるのは,$CFG->excelisofiles, $CFG->latinexcelexportの2つですね.いずれかに値がセットされていたら,強制的にlatin扱いされます.どこでこれらの値を設定しているのかな?
この二つの変数のうち,$CFG->latinexcelexportは,サイト管理-言語設定-言語設定のExcelエンコーディング(プルダウンメニュで,"Unicode"と"Latin"が選択可能)のようですね.excelisofilesはmoodleフォルダにも,moodledata/langフォルダのどのファイル内にも存在しないようです(grepで調べた限りでは).雰囲気としては,Excel ISO filesっぽいですよね.
Moodle1.8.3+に同梱されているPAERライブラリのSetVersion()は以下のように8以外には対応していない.
function setVersion($version)
{
if ($version == 8) { // only accept version 8
$version = 0x0600;
$this->_BIFF_version = $version;
// change BIFFwriter limit for CONTINUE records
$this->_limit = 8228;
$this->_tmp_format->_BIFF_version = $version;
$this->_url_format->_BIFF_version = $version;
$this->_parser->_BIFF_version = $version;$total_worksheets = count($this->_worksheets);
// change version for all worksheets too
for ($i = 0; $i < $total_worksheets; $i++) {
$this->_worksheets[$i]->_BIFF_version = $version;
}$total_formats = count($this->_formats);
// change version for all formats too
for ($i = 0; $i < $total_formats; $i++) {
$this->_formats[$i]->_BIFF_version = $version;
}
}
}
feedbackモジュールでは,このPEARライブラリは使用していないのでしょうか.
http://pizzaseo.com/php-excel-creator-class
こちらで公開している改良版のライブラリでも,setVersion()は8だけですねぇ.
久しぶりです。まだmoodle 1.6を使っている武本Timothyです。
mod/feedbackフォルダのanalysis_to_excel.phpには
$workbook->setVersion(8);
もありません。
$workbook->setVersion(10);
追加しましたら、Excelのブックには
<br />
<b>Fatal error</b>: Call to undefined function: setversion() in <b>/home10/at1/econo/public_html/moodle16/mod/feedback/analysis_to_excel.php</b> on line <b>64</b><br />
とあっただけです。
$workbook->send($filename);
を加えたら
<br />
<b>Fatal error</b>: Call to undefined function: send() in <b>/home10/at1/econo/public_html/moodle16/mod/feedback/analysis_to_excel.php</b> on line <b>63</b><br />
とありました。
Moodle 1.6での文字化け解消方法はございませんでしょうか。
昔は成績でも同じ問題がありましたが、CVSでダウンロードして、エディターで文字コードを
UTF-8からJSISに変換したら、乗り越えることができました。しかしxlsのファイルしかありません。
それをエディターで開くとさすが、UTF-8では内容が見えますが、SJISで保存し直すとExcel
ファイルとしては認識されなくなります。
よろしくお願いします。