2013年10月11日金曜日

vTigerCRMのレポート機能のExcel出力の文字化けを直す その1

vTigerCRM5系はレポート機能からExcel出力が可能ですが、そのままだと日本語データは全て文字化けしてしまいます。

文字化けの修正自体は非常に簡単です。
修正対象のソースは/modules/Reports/ReportRun.phpです。
エクセル出力に関しては、writeReportToExcelFileを利用していますのでこのfunctionを修正します。
修正内容はシンプルで、 $worksheet->writeでエクセルに書き込んでる箇所を mb_convert_encodingで変換するように修正すれば可能です。

UPDATE vtiger_leaddetails SET leadsource = '--なし--' WHERE leadsource = '--None--';

function writeReportToExcelFile($fileName, $filterlist='') {

 global $currentModule, $current_language,$log;
 $mod_strings = return_module_language($current_language, $currentModule);

 require_once("include/php_writeexcel/class.writeexcel_workbook.inc.php");
 require_once("include/php_writeexcel/class.writeexcel_worksheet.inc.php");

 $workbook = &new writeexcel_workbook($fileName);
 $worksheet =& $workbook->addworksheet();

 # Set the column width for columns 1, 2, 3 and 4
 $worksheet->set_column(0, 3, 25);

 # Create a format for the column headings
 $header =& $workbook->addformat();
 $header->set_bold();
 $header->set_size(12);
 $header->set_color('blue');

 $arr_val = $this->GenerateReport("PDF",$filterlist);
 $totalxls = $this->GenerateReport("TOTALXLS",$filterlist);

 if(isset($arr_val)) {
  foreach($arr_val[0] as $key=>$value) {


//ここを修正
   //$worksheet->write(0, $count, $key , $header);
   $worksheet->write(0, $count, mb_convert_encoding($key, "sjis-win", "UTF-8") , $header);

同じFunction内に三つほど書き込んでいる箇所がありますので適宜修正してください。

ちなみにですが、mb_convert_encodingの引数をsjis-winでなくsjisとしてしまうと①Windowsの固有文字が文字化けしてしまいます。
文字化けの対応はこれで終了です。

ただし、作成したExcelを開く際に時折以下のようなメッセージが表示されることがわかりました。


この原因ですが、一つのセルに大して255文字以上の文字長をセル書き込もうとする発生することがわかりました。
vTigerCRM5系が採用しているExcel出力ライブラリがphp_writeexcelというライブラリなのですが、なにやらソースを読んでいくとExcel5までしか対応してない的な記述が。。。

それでは、php_writeexcelを新しいバージョンのものに入れ替えようと探してみましたが、2005年を最後に更新が終了しており、vTigerCRMが採用しているライブラリもその最終版のようです。

で、これどうするの?ってのは、その2に続きます。

CRM TOUCHのサイトはこちら
vTigerCRMの日本語の情報に関してはこちら