質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

658閲覧

PHP CSV 出力 ヘッダーを2段にする方法

rikutennis

総合スコア55

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/05/14 05:40

編集2020/05/14 09:32

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
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 }

現状
現状

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/14 06:07

table で出力したいんですか?書いてないので確認です。
rikutennis

2020/05/14 06:10

tableで出力したいです。
退会済みユーザー

退会済みユーザー

2020/05/14 06:15

最終的にどのようにHTMLを組みたいのかをわかるように「質問に追記」してください。
rikutennis

2020/05/14 06:23

出力したいのはCSVです。 HTMLは既に組んであります。
退会済みユーザー

退会済みユーザー

2020/05/14 06:25

あなたのHTMLに関する理解度を把握して回答したいなと思ったから、HTMLで書いて欲しい。 少なくともそれを修正するだけで回答できるので、回答者に手間を煩わせる必要もありませんよね? 画像だと、それを書き起こす手間が発生します。
rikutennis

2020/05/14 06:34

確かにその通りだと思います。 追記をしましたのでご確認よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/05/14 06:42

$periodSeparatorがどんなふうに値を持っているのか不明です。
退会済みユーザー

退会済みユーザー

2020/05/14 06:51 編集

$weekNumByMonth も同様に、ちゃんと提示ないと、、、 自分が質問に書いた内容で過不足がないか推敲してくださいね。
rikutennis

2020/05/14 07:01

こちらで十分でしょうか
退会済みユーザー

退会済みユーザー

2020/05/14 09:16 編集

self::periodSeparator($todayDate) の定義もないし…クラス名も不明。 一度提示した情報だけで、回答できるかどうかシミュレーションしてみては? 回答者って、与えられた情報で実際にコードを書いて回答しているんですよ
退会済みユーザー

退会済みユーザー

2020/05/14 09:20

Laravelで書いているなら、Controller出して欲しい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問