ThinkPHP3.2.3とPHPExcel1.8の統合:セル結合を含むExcelエクスポート機能の実装

  1. まず、以下のリンクからPHPExcelのclassesフォルダ内のファイルをダウンロードします。 https://github.com/PHPOffice/PHPExcel

  2. ダウンロードしたファイルをThinkPHPのvendorディレクトリ内に新しいフォルダ「Phpexcel」を作成し、ファイルを配置します。

  3. 次に、エクスポート用の関数を以下のように実装します。

function excelExportWithData($exportData, $fileName = null, $headers = null, $sheetName = 'sheet1') {
    vendor('Phpexcel.PHPExcel'); // Phpexcelライブラリの読み込み
    
    // ファイル名が指定されていない場合は現在のタイムスタンプを使用
    if (is_null($fileName)) {
        $fileName = time();
    }
    
    // ヘッダーが指定されている場合はデータの先頭に追加
    if (is_array($headers)) {
        array_unshift($exportData, $headers);
    }
    
    $excelObj = new \PHPExcel();
    
    // Excelコンテンツの作成
    $headerCount = count($exportData);
    
    $sheet = $excelObj->setActiveSheetIndex(0);
    
    // 1行目のセル結合
    $sheet->mergeCells('A1:K1');
    $sheet->setCellValue('A1', '');
    
    // 2行目のセル結合と中央寄せ
    $sheet->mergeCells('A2:K2');
    $sheet->setCellValue('A2', '優良教育システム支払明細');
    $sheet->getStyle('A2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $sheet->getStyle('A2')->getFont()->setSize(20);
    $sheet->getRowDimension('A2')->setRowHeight(40);
    
    // 3行目のセル結合と中央寄せ
    $sheet->mergeCells('A3:K3');
    $sheet->setCellValue('A3', 'ユーザー:教育出版システム    時間:2019-01-12から2019-12-12 練習帳:200種類   支払金額:20000元');
    $sheet->getStyle('A3')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    $sheet->getStyle('A3')->getFont()->setSize(12);
    $sheet->getRowDimension('A3')->setRowHeight(30);
    
    // データの書き込み
    foreach ($exportData as $rowIndex => $rowData) {
        $currentRow = $rowIndex + 5; // データ開始行(5行目から)
        $columnIndex = 0;
        
        foreach ($rowData as $cellValue) {
            $currentColumn = chr(65 + $columnIndex); // A, B, C... 列の取得
            $sheet->setCellValue($currentColumn . $currentRow, $cellValue);
            $columnIndex++;
        }
    }
    
    // 列の設定
    for ($i = 0; $i < 9; $i++) {
        $columnLetter = chr(65 + $i);
        $sheet->getColumnDimension($columnLetter)->setWidth(20);
        $sheet->getStyle($columnLetter . '5')->getFont()->setSize(12);
        $sheet->getStyle($columnLetter . '5')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
            ->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
    }
    
    // シート名の設定
    $sheet->setTitle($sheetName);
    $excelObj->setActiveSheetIndex(0);
    
    // ヘッダーの設定
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="' . $fileName . '.xls"');
    header('Cache-Control: max-age=0');
    
    // Excelファイルの出力
    $writer = \PHPExcel_IOFactory::createWriter($excelObj, 'Excel5');
    $writer->save('php://output');
}
  1. 上記の関数を呼び出してExcelファイルを生成します。
$exportList = array(
    0 => array('1', '5.3数学練習帳', '*', '23121', '23122', '34000', '140000', '100', '149900', '*'),
    1 => array('', '', 'founder', '*', '23123', '23124', '4', '*', '*', '2019/1/12 21:12:32'),
    2 => array('', '', 'nick', '*', '23124', '23125', '7', '100', '149900', '*')
);

$columnHeaders = array('番号', '練習帳名', '利用者', '累計数量(QRコード)', '開始数', '終了数', '分配', '残り処理費用', '最終支払額', '購入日時');

excelExportWithData($exportList, 'payment_report', $columnHeaders);
  1. 実行結果は以下のようになります。

7月13日 22:22 投稿