PHPExcelでExcel2000/XP形式のファイルをつくる


PHPExcelはPHP5でExcel2007形式のファイルを作成できるライブラリですが、一応Excel5形式にも対応しているのでExampleのとおりつくってる。

<?php
require_once 'PHPExcel.php';
require_once 'PHPExcel/Writer/Excel5.php';
      
$excel = new PHPExcel();
$excel->setActiveSheetIndex(0);


function setExcelData(&$sheet, $col, $row, $data)
{
  $sheet->setCellValue($col.$row, $data);
  $sheet->getColumnDimension($col)->setAutoSize(true);
  $style = $sheet->getStyle($col.$row);
  $style->getFont()->setName('MS Gothic');
  $style->getBorders()->getRight()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
  $style->getBorders()->getLeft()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
  $style->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
  $style->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
  $style->getFill()->getStartColor()->setARGB('FF808080');
}

$sheet = $excel->getActiveSheet();

$row = 1;

setExcelData($sheet, 'A', $row, '名前');
setExcelData($sheet, 'B', $row, 'フリガナ');

$row++;

setExcelData($sheet, 'A', $row, '鈴木一郎');
setExcelData($sheet, 'B', $row, 'スズキイチロウ');

$row++;

setExcelData($sheet, 'A', $row, '田中太郎');
setExcelData($sheet, 'B', $row, 'タナカタロウ');

$savefile = 'list_'.date('Ymd').'.xls';
$savepath = '/tmp';

$writer = new PHPExcel_Writer_Excel5($excel);
$writer->save($savepath.'/'.$savefile);

header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachement; filename=${savefile}");
header("Content-Length: ".filesize($savepath.'/'.$savefile));

readfile($savepath.'/'.$savefile);
exit;

こんな感じでやってみたら日本語が文字化けしてしまいます。

ソース追ってみると、内部的にはBIFF8に対応させようとしてるコードがあるので、PHPExcel_Writer_Excel5_Workbook::setVersion(8)すれば何とかなりそうなんですが、呼び出す方法がないのでソースを書き換えて対応。

PHPExcel/Excel5.php

<?php
// 66行目付近
/**
 * Save PHPExcel to file
 *
 * @param 	string 		$pFileName
 * @param       integer         $biffVersion     #追加
 * @throws 	Exception
 */	
public function save($pFilename = null, $biffVersion = null /* 引数$biffVersionを追加 */) {
    $phpExcel = $this->_phpExcel;
    $workbook = new PHPExcel_Writer_Excel5_Writer($pFilename);
    // 引数に$version指定がある場合はsetVersionを追加
    if (!is_null($biffVersion))
    {
      $workbook->setVersion($biffVersion);
    }
    // ...以下省略

あとは呼び出し側で

$writer = new PHPExcel_Writer_Excel5($excel);
// 2000/XP形式にしたい場合は$biffVersion=8で。
$writer->save($savepath.'/'.$savefile, 8);

これでとりあえず文字化けは解消。もうちょとスマートな方法ないのかな。