Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
W
winas_admin
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
winas_lib
winas_admin
Commits
9949d104
Commit
9949d104
authored
Apr 22, 2024
by
李虞帆
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
csv出力ライブラリの追加
parent
57858a38
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
189 additions
and
0 deletions
+189
-0
CsvStreamServices/AbstractCsvStreamService.php
CsvStreamServices/AbstractCsvStreamService.php
+140
-0
CsvStreamServices/ExampleCsvStreamService.php
CsvStreamServices/ExampleCsvStreamService.php
+49
-0
No files found.
CsvStreamServices/AbstractCsvStreamService.php
0 → 100644
View file @
9949d104
<?php
namespace
App\Services\CsvStreamServices
;
use
App\Exceptions\EmptyCsvDownloadException
;
use
App\Exceptions\EncodingCsvDownloadException
;
use
Illuminate\Support\LazyCollection
;
/**
* CSVダウンロードサービス抽象クラス(ストリーム版)
* @author k-maeda@winas.jp
*/
abstract
class
AbstractCsvStreamService
{
/**
* CSVデータ(2行目以降)
*/
private
?
LazyCollection
$csvData
=
null
;
/**
* ファイル名取得
* @param void
* @return String
*/
abstract
protected
function
getFileName
()
:
string
;
/**
* 項目名データ取得
* @param void
* @return Array
*/
abstract
protected
function
getCsvHeader
()
:
Array
;
/**
* 項目名データ取得
* @param void
* @return Array
*/
abstract
protected
function
format
(
$entity
)
:
Array
;
/**
* CSVデータ取得
* @param void
* @return Array
*/
public
function
setCsvData
(
LazyCollection
$csvData
)
{
$this
->
csvData
=
$csvData
;
}
/**
* Description
* @return type
*/
public
function
streamDownload
()
{
$csv_header
=
$this
->
getCsvHeader
();
$file_name
=
$this
->
getFileName
();
$csv_data
=
$this
->
csvData
;
if
(
count
(
$csv_header
)
>
0
)
{
$csv_header
=
$this
->
convertEncoding
(
$csv_header
);
// SJIS-win
}
$callback
=
function
()
use
(
$csv_data
,
$csv_header
)
{
$fp
=
fopen
(
'php://output'
,
'w'
);
fputcsv
(
$fp
,
$csv_header
);
foreach
(
$csv_data
as
$record
)
{
$row
=
$this
->
format
(
$record
);
$row
=
$this
->
convertEncoding
(
$row
);
// SJIS-win
$row
=
$this
->
convertCommaDoubleByte
(
$row
);
// 半角カンマを全角へ変換
$row
=
$this
->
deleteCRLF
(
$row
);
// 改行を削除
fputcsv
(
$fp
,
$row
);
}
fclose
(
$fp
);
};
return
response
()
->
streamDownload
(
$callback
,
$file_name
.
'.csv'
,
$this
->
responseHeaders
(
$file_name
));
}
/**
* ヘッダー取得
* @param String $fileName
* @return Array
*/
private
function
responseHeaders
(
String
$fileName
)
{
return
[
'Cache-Control'
=>
'must-revalidate, post-check=0, pre-check=0'
,
'Content-type'
=>
'text/csv'
,
'Content-Disposition'
=>
'attachment; filename='
.
$fileName
.
'.csv'
,
'Content-Transfer-Encoding'
=>
'binary'
,
'Expires'
=>
'0'
,
'Pragma'
=>
'public'
];
}
/**
* Shift-jis に変換
* @param Array $record
* @return Array $record
*/
private
function
convertEncoding
(
Array
$record
)
{
$code
=
mb_convert_variables
(
'SJIS-win'
,
'UTF-8'
,
$record
);
if
(
$code
===
false
)
{
throw
new
EncodingCsvDownloadException
(
'CSVのエンコード変換に失敗しました。'
);
}
return
$record
;
}
/**
* 半角カンマ「,」がある場合、全角カンマ「,」へ変換
* @param Array $record
* @return Array $result
*/
private
function
convertCommaDoubleByte
(
Array
$record
)
{
$result
=
[];
foreach
(
$record
as
$column
)
{
$result
[]
=
str_replace
(
','
,
','
,
$column
);
}
return
$result
;
}
/**
* 改行がある場合、削除
* @param Array $record
* @return Array $result
*/
private
function
deleteCRLF
(
Array
$record
)
{
$result
=
[];
foreach
(
$record
as
$column
)
{
// すべての改行コードに対応していることを明確にするため、あえて全部記載している。
// TODO なぜか効かないがCSVファイル上では\nという文字として扱われているため、今のところ問題なし。いずれ修正したい
$result
[]
=
str_replace
([
"
\r\n
"
,
"
\r
"
,
"
\n
"
],
''
,
$column
);
}
return
$result
;
}
}
CsvStreamServices/ExampleCsvStreamService.php
0 → 100644
View file @
9949d104
<?php
namespace
App\Services\CsvStreamServices
;
use
App\Exceptions\EmptyCsvDownloadException
;
use
App\Exceptions\EncodingCsvDownloadException
;
use
Illuminate\Support\LazyCollection
;
/**
* 実装例:CSV情報
* @author maeda
*/
class
ExampleCsvStreamService
extends
AbstractCsvStreamService
{
/**
* ファイル名取得
* @param void
* @return String
*/
protected
function
getFileName
()
:
string
{
return
'example.csv'
;
}
/**
* 項目名データ取得
* @param void
* @return Array
*/
protected
function
getCsvHeader
()
:
Array
{
return
[
'列1'
,
'列2'
,
'列3'
];
}
/**
* 項目データ取得
* @param void
* @return Array
*/
protected
function
format
(
$entity
)
:
Array
{
$row
=
[];
$row
[]
=
$entity
->
column1
;
$row
[]
=
$entity
->
column2
;
$row
[]
=
$entity
->
column3
;
return
$row
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment