前提・実現したいこと
ここに質問の内容を詳しく書いてください。
PHP(Laravel)で労務管理システムを作っています。
CSV出力機能実装中につまづいてしまいました。
このように上段に月、下段に週となるように出力するCSVのヘッダーを作りたいです。
###HTML
HTML
1<thead> 2 <tr> 3 <th rowspan="2">名前</th> 4 <th rowspan="2">部署</th> 5 <th rowspan="2">役職</th> 6 <th rowspan="2">予想</th> 7 <th rowspan="2">残業</th> 8 <th rowspan="2">合計</th> 9 @for ($month = $periodSeparator["startMonth"]; $month <= $periodSeparator["endMonth"]; $month++) 10 <th colspan={{ $weekNumByMonth[$month] }}>{{ $month }}月</th> 11 @endfor 12 </tr> 13 <tr> 14 @for ($month = $periodSeparator["startMonth"]; $month <= $periodSeparator["endMonth"]; $month++) 15 @for ($weeks = 1; $weeks <= $weekNumByMonth[$month]; $weeks++) 16 <th>{{ $weeks }}週</th> 17 @endfor 18 @endfor 19 </tr> 20</thead>
$periodSeparator["startMonth"] $periodSeparator["endMonth"] ```には半期の始めと終わりの月が入ってます 例) (1〜6月の場合) $periodSeparator["startMonth"] = 1 $periodSeparator["endMonth"] = 6 (7〜12月の場合) $periodSeparator["startMonth"] = 7 $periodSeparator["endMonth"] = 12 ```ここに言語を入力 $weekNumByMonth[$month] ```には月ごとの週数が入ってます。 日曜日の回数+最後の週が日曜日で終わらない時は+1となっています。 Carbonを使って以下のように取得しています。 ```PHP public function periodSeparator($date) { if ($date->quarter < 3) { $periodSeparator["startMonth"] = 1; $periodSeparator["endMonth"] = 6; } else { $periodSeparator["startMonth"] = 7; $periodSeparator["endMonth"]= 12; } return $periodSeparator; } $todayDate = Carbon::now(); $periodSeparator = self::periodSeparator($todayDate); for ($month = $periodSeparator["startMonth"]; $month <= $periodSeparator["endMonth"]; $month++) { $date = Carbon::create($todayDate->year, $month); $weekNumByMonth[$month] = $date->endOfMonth()->weekOfYear - $date->startOfMonth()->weekOfYear + 1; }
例)$weekNumByMonth[1] = 5
例)$weekNumByMonth[2] = 5
例)$weekNumByMonth[3] = 6
例)$weekNumByMonth[4] = 5
例)$weekNumByMonth[5] = 5
例)$weekNumByMonth[6] = 5
例)$weekNumByMonth[7] = 5
例)$weekNumByMonth[8] = 6
例)$weekNumByMonth[9] = 5
例)$weekNumByMonth[10] = 5
例)$weekNumByMonth[11] = 6
例)$weekNumByMonth[12] = 5
該当のソースコード
現在のConfigはこちら
hourListCSV
PHP
1<?php 2 3return [ 4 'page' => [ 5 '10', 6 '20', 7 '50', 8 '100' 9 ], 10 'csv_header' => [ 11 '氏名', 12 '部署', 13 '役職', 14 '予想', 15 '残業', 16 '合計' 17 ] 18];
ヘッダーの定義部分(コントローラー)はこのようになっています。
PHP
1class HourListController extends BaseController 2{ 3 const CSV_DEFAULT_DATE_FORMAT = 'Y-m-d'; 4 const PROJECT_SESSION_NAME = 'userDepartData'; 5 6public function download() 7 { 8 $stream = fopen('php://temp', 'r+b'); 9 $header = config('hourListCSV.csv_header'); 10 fputcsv($stream, $header); 11 12 rewind($stream); 13 $csv = str_replace(PHP_EOL, "\r\n", stream_get_contents($stream)); 14 $csv = mb_convert_encoding($csv, 'SJIS-win', 'UTF-8'); 15 $file_name = date('Y_m_d').'_工数一覧'.'.csv'; 16 $headers = [ 17 'Content-Type' => 'text/csv', 18 'Content-Disposition' => 'attachment; filename="'. $file_name . '"', 19 ]; 20 21 return response()->make($csv, 200, $headers); 22 }
あなたの回答
tips
プレビュー