2013年10月16日水曜日

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

vTigerCRMのレポート機能のExcel出力の文字化けを直す その2の続きです。
もはや文字化けの話ではないですが、一応このタイトルで。


vTigerCRMの要約レポートをExcelで出力した場合のフォーマットですが、集計項目に関してはその項目のラベルまでvTigerCRMは出力しれくれません。
これは、今のところvTigerCRM6でも(β版を確認する限り)でも一緒です。


このExcel出力機能ですが「基本的にはこのまま使う人はいない。各々のフォーマットにあわせるための部品をダウンロード」といった的な機能と認識しています。

とはいえ、「合計、平均、最小、最大」が出力される集計項目に対して、何の項目なのか?といったラベルが出力されないのは使い勝手が悪いとですよね。

それでそのラベルが出力されるようその2で移植したvTigerCRM6のソースに対して、修正を加えます。

修正対象は、writeReportToExcelFile同じです。

まずは、そのソースを丸っと記します。

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

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

  require_once("libraries/PHPExcel/PHPExcel.php");

  $workbook = new PHPExcel();
  $worksheet = $workbook->setActiveSheetIndex(0);

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

  $header_styles = array(
      'fill' => array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'color' => array('rgb'=>'E1E0F7') ),
      //'font' => array( 'bold' => true )
  );

  if(isset($arr_val)) {
    $count = 0;
    $rowcount = 1;
    //copy the first value details
    $arrayFirstRowValues = $arr_val[0];
    array_pop($arrayFirstRowValues);      // removed action link in details
    foreach($arrayFirstRowValues as $key=>$value) {
      $worksheet->setCellValueExplicitByColumnAndRow($count, $rowcount, $key, true);
      $worksheet->getStyleByColumnAndRow($count, $rowcount)->applyFromArray($header_styles);

      // NOTE Performance overhead: http://stackoverflow.com/questions/9965476/phpexcel-column-size-issues
      //$worksheet->getColumnDimensionByColumn($count)->setAutoSize(true);

      $count = $count + 1;
    }

    $rowcount++;
    foreach($arr_val as $key=>$array_value) {
      $count = 0;
      array_pop($array_value);  // removed action link in details
      foreach($array_value as $hdr=>$value) {
        if($hdr == 'ACTION') continue;
        $value = decode_html($value);
        // TODO Determine data-type based on field-type.
        // String type helps having numbers prefixed with 0 intact.
        $worksheet->setCellValueExplicitByColumnAndRow($count, $rowcount, $value, PHPExcel_Cell_DataType::TYPE_STRING);
        $count = $count + 1;
      }
      $rowcount++;
    }

    // Summary Total
    $rowcount++;
    $count=0;
    if(is_array($totalxls[0])) {

      if($current_language=="ja_jp"){

        $worksheet->setCellValueExplicitByColumnAndRow($count, $rowcount, "フィールド");
        $worksheet->getStyleByColumnAndRow($count, $rowcount)->applyFromArray($header_styles);

        $count=1;

      }

      foreach($totalxls[0] as $key=>$value) {
        $chdr=substr($key,-3,3);
        $translated_str = in_array($chdr ,array_keys($mod_strings))?$mod_strings[$chdr]:$key;
        $worksheet->setCellValueExplicitByColumnAndRow($count, $rowcount, $translated_str);
        $worksheet->getStyleByColumnAndRow($count, $rowcount)->applyFromArray($header_styles);

        $count = $count + 1;
      }
    }

    $rowcount++;
    foreach($totalxls as $key=>$array_value) {
      $count = 0;
      foreach($array_value as $hdr=>$value) {

        if ($count==0){

          $temp_hdr =substr($hdr,0,strlen($hdr)-4);

          $module_name =substr($hdr,0,mb_strpos($hdr,'_'));

          $temp_hdr =substr($temp_hdr,strlen($module_name)+1,strlen($temp_hdr));

          $calc_field_label = getTranslatedString($temp_hdr,$module_name); //module


          $worksheet->setCellValueExplicitByColumnAndRow(0, $key+$rowcount, $calc_field_label);

          $count = 1;

        }

        $value = decode_html($value);
        $worksheet->setCellValueExplicitByColumnAndRow($count, $key+$rowcount, $value);
        $count = $count + 1;
      }
    }
  }

  $workbookWriter = PHPExcel_IOFactory::createWriter($workbook, 'Excel5');
  $workbookWriter->save($fileName);
}

主な修正箇所は最後のforeachのループの中身です。
ラベル出力の際にはちゃんと日本語の翻訳結果を使用するようにしています。
こちらの結果は以下となります。


こんな感じでそこそこ満足なフォーマットになります。

こちら、vTigerCRM5.4に移植してと色々やってきましたが、いずれvTigerCRM6の正規版がリリースされた場合、そのままこのソースが利用できるかはまだわかりません。
現時点ではあくまでβ版です。

そろそろRC版がリリースされると良いですね。
以上です。

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