WithChunkReadingãšããããµã€ãºã§æ°ããã€ã³ããŒããäœæããŸããã ç§ãçŽé¢ããŠããåé¡ã¯ãã€ã³ããŒã¿ãŒãæ¥ä»åãã¿ã€ã ã¹ã¿ã³ãã«å€æããããšã§ãïŒç§ã¯ãã®ã¿ã€ã ã¹ã¿ã³ããä¿¡ããŠããŸãïŒ43257.0ã åé¡ãæè³ããåŸãç§ã¯éåžžã«å€ãã¹ã¬ããhttps://github.com/Maatwebsite/Laravel-Excel/issues/404ãèŠã€ããŸããããããŠãããä¿®æ£ãã解決çã®1ã€ã¯ã vendor/maatwebsite/excel/src/Jobs/ReadChunk.php
å©çšå¯èœãªã¯ã©ã¹ReadChunkã§trueå€ãfalseã«èšå®ããããšã§ãã$this->reader->setReadDataOnly(true);
ãã®ãœãªã¥ãŒã·ã§ã³ã¯ä»ã®ãšããæ©èœããŸãããcomposerã®æŽæ°ãè¡ããšãã©ã€ãã©ãªã§æ§æã§ããªããããåé€ãããŸãã
äºæ³ãããè¡åïŒ
å³æžé€šã¯æåŸ éãã«æ¥ä»ãã¢ããããŒãããããšãæåŸ ããŠããŸãã
å®éã®åäœïŒ
ã©ã€ãã©ãªã¯æ¥ä»ãã¿ã€ã ã¹ã¿ã³ãã«å€æããŸãïŒã¿ã€ã ã¹ã¿ã³ããæ³å®ïŒ
ãããç§ã®ã€ã³ããŒãã¯ã©ã¹ã§ãã
` åå空éApp \ Imports;
App \ Sampleã䜿çšããŸã;
Maatwebsite \ Excel \ Concerns \ ToModelã䜿çšããŸã;
Maatwebsite \ Excel \ Concerns \ WithBatchInsertsã䜿çšããŸã;
Maatwebsite \ Excel \ Concerns \ WithChunkReadingã䜿çšããŸãã
Maatwebsite \ Excel \ Concerns \ WithHeadingRowã䜿çšããŸã;
Maatwebsite \ Excel \ Imports \ HeadingRowFormatterã䜿çšããŸã;
HeadingRowFormatter :: defaultïŒ 'none'ïŒ;
ã¯ã©ã¹Sampleã¯ãToModelãWithHeadingRowãWithBatchInsertsãWithChunkReadingãå®è£
ããŸã
{{
public function model(array $row)
{
return new user([
'UserName' => $row['UserName'],
'Password' => $row['Password'],
'date' => $row['date'],
]);
}
public function batchSize(): int
{
return 1000;
}
public function chunkSize(): int
{
return 1000;
}
} `
ãã¹ããããŠããŸãããã次ã®ããšãè¡ãå¿ èŠããããšæããŸãã
return new user([
'UserName' => $row['UserName'],
'Password' => $row['Password'],
'date' => \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['date']),
]);
setReadDataOnly
ãä»ã®ç¶æ³ã§åé¡ãåŒãèµ·ããããšãèŠããŠããã®ã§ããããããäžåºŠè¿œå ããã ãã§ã¯æ°ãé²ãŸãªãã ãããããããããªããã€ã³ã®æžå¿µäºé
ãäœãã«ããããšãã§ããŸãã
ç§ããã®åé¡ãçµéšããŸããã excelToDateTimeObject
ã¯å®éã®æ¥ä»ãæ»ããŸããããããã«ã€ããŠå¿é
ããã®ã¯è¯ãããšãããããŸããã
ãããã次ã®ãããªãã®ã§ãïŒ
interface WithDateObjects
{
/**
* An array of columns to convert to DateTime Objects.
* Either named column headers or coordinate columns.
*
* <strong i="8">@return</strong> array
*/
public function dateColumns(): array;
}
class MyImport implements WithDateObjects
{
public function dateColumns(): array
{
return ['birthday', 'wedding_date'];
}
}
次ã«ãlaravel excelã¯ãã€ã³ããŒããWithDateObjectsãå®è£
ããŠãããã©ãããæ€åºããå¿
èŠã«å¿ããŠ\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($this->cell->getValue())
ãèšå®ããŸããïŒ
PSïŒããã¯ã«ãŒãã³ã«å€æããå¿ èŠããããŸããïŒ
Carbon
æ¥ä»ãè¿ãWithDates
æžå¿µãè¿œå ããPRãåãå
¥ããŸã;ïŒ
ç§ãåé¡ãçºçããŸãããããããŸã§ã¯åé¡ãªãåäœãããšã©ãŒunexpected data found
ãçºçããŸããããããè¿œå ããŠãã
\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['date'])
ããã§ããšã©ãŒãçºçããŸãã
A non well formed numeric value encountered
ãŸããã«ãŒãã³ã§å€æããããšããŸããããæ©èœããŸãã
ãã®å Žåã $row['date']
ã¯æŽæ°ã§ã¯ãããŸããã excelToDateTimeObject
ã¯ãæ¥ä»ãExcelã®æ¥ä»ãšããŠãã©ãŒããããããŠããå Žåã«ã®ã¿æ©èœããŸãã
ããŒããããã¯ãã§ã«æ¥ä»ã§ãã©ãŒããããããŠããŸã
ç§ã¯"maatwebsite/excel": "^3.1",
ãããã°ããŠã¿ãŠã $row['data']
å
容ã確èªããŠãã ããã
WithDates
PRãéãããšã¯ã§ããŸãããå°ãªããšã1é±éã¯ããããŸãã ç§ã¯äŒè°ã«åå ããŠããŠãä»ã¯ããã«éäžã§ããŸããã
ããã¯1/1/18
ã§ãããmysqlããŒãã«ã§Excelã®æ¥ä»ããæ¥ä»ã«èªåçã«å€æãããå¿
èŠããããŸããïŒ ç§ã¯ä»¥åã«ãã®ããã±ãŒãžã䜿çšããŸããããããŠããã¯ãã èŠã€ããã ãã§åäœããŸã...ãããä»ãã®ãšã©ãŒãåãåããŸã
1/1/18
åãæ»ããå Žåãããã¯æããã«æŽæ°ã§ã¯ãããŸãã:)ãããã£ãŠã excelToDateTimeObject
䜿çšããªãã§ãã ããã 代ããã«ãããã«å¯ŸåŠããããã«Carbon::createFromFormat(...)
ã䜿çšããå¿
èŠããããŸã
@patrickbrouwersãããããwithDatesã®æžå¿µäºé ã¯æåã«excelToDateTimeObjectãè©Šè¡ãããããäŸå€ãã¹ããŒããå Žåã¯ãCarbon :: createFromFormatïŒïŒãè©Šè¡ããŸãã dateColumnã¡ãœããã¯ãæ¥ä»ã®åœ¢åŒã瀺ãããšãã§ããŸãã
public function dateColumns(): array
{
return ['birthday' => âd/m/Yâ, 'wedding_date'];
}
PSïŒç§ã¯èªåã®æºåž¯é»è©±ã§ãã®ã³ãŒããæžããŠã¿ãŸããããããã¯ãã£ãã¯ãè¡ãæ¹æ³ãããããŸãã
@devinfdããã§ãã:)
psã¯ããªãã®ããã¯ãã£ãã¯ãä¿®æ£ããŸãã;ïŒ
@devinfdãã§ã«å®è£ ã¯ã©ããŸã§
ç§ã¯PRã«åãçµã¿å§ããŸããããå®è£ ãè€éã«ãªãããšã«ããã«æ°ã¥ããŸããã @patrickbrouwersã¯ã³ãŒãããŒã¹ãã¬ãã¥ãŒããŠãä»åŸã®æåã®æ¹æ³ã確èªããããšããŠããŸããã
ãããŸã§ã®éãImportãªããžã§ã¯ãã§ãã«ããŒã¡ãœããã䜿çšããŠããŸãã
/**
* Transform a date value into a Carbon object.
*
* <strong i="8">@return</strong> \Carbon\Carbon|null
*/
public function transformDate($value, $format = 'Y-m-d')
{
try {
return \Carbon\Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value));
} catch (\ErrorException $e) {
return \Carbon\Carbon::createFromFormat($format, $value);
}
}
class Sample implements ToModel
{
public function model(array $row)
{
return new user([
'name' => $row[0],
'email' => $row[1],
'birth-date' => $this->transformDate($row[2]),
]);
}
}
ããã«ãåé¡ããããŸãã
@devinfd
ãã«ããŒé¢æ°ã䜿çšããŠæ¥ä»ããã©ãŒãããããŠããŸãã ãã®åœ¢åŒã§è¿ãããŸã1943-10-15 00:00:00
ãšã«ãã10/15/1943
ãšããŠè¿ãããšãã§ããŸããïŒ
ãããšããããã³ããšã³ãã§ãã®ã¿ã€ãã®ãã©ãŒããããåŠçããæ¹ãè¯ãã§ããããïŒ
ç§ã¯èå³ããããŸãã誰ãããããã®å¥åŠãªæŽæ°ãšããŠæ»ã£ãŠããæ¥ä»ãã£ãŒã«ãã®ãŠãŒã¹ã±ãŒã¹ãæãã§ããŸãã/æåŸ ããŠããŸãã/æã£ãŠããŸããïŒ ãã®ãããªããšã¯ã€ã³ããŒãæã«èªåçã«è¡ãããã¯ãã§ãã ã2019-01-10ããšããŠExcelã§è¡šç€ºã§ããæ¥ä»ã43473.0ãšããŠè¿ãããã·ããªãªãæ³åããããšã¯ã§ããŸããã
@nickpoulosã¯ãnumberformatãæ¥ä»åœ¢åŒã®å Žåã«
PhpSpreadsheetã¯ããããæ¥æãªããžã§ã¯ãã«å€æããããšããŸããNumberFormatè¡649ãåç
§ããŠãã ãããããã倱æããå Žåãããã«ã€ããŠã§ããããšã¯å€ããããŸããã
æ¥ä»ã空ã«ãªãããšãã©ã®ããã«æ€èšŒã§ããŸããïŒ
誰ã§ããExcelãã¡ã€ã«ã®ã€ã³ããŒãã«é²è¡ç¶æ³ã®ã³ãŒããæçš¿ã§ããŸãã
誰ããåé¡ã解決ããŸãããïŒ
誰ããåé¡ã解決ããŸãããïŒ
@ Jaikangam93
å°ãé
ããŸããããããŸããŸ_WithCustomValueBinder_ã®å©ããåããŠä¿®æ£ããæ¥ä»åã®åº§æšãå°ããã§ãã¯ããPhpOffice \ PhpSpreadsheet \ Shared \ Dateã§excelToDateTimeObjectã¡ãœããã䜿çšããŠãæåŸã«ã»ã«ã®å€ãæååãšããŠèšå®ããŸããã
ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
public function bindValue(Cell $cell, $value)
{
if(preg_match('/^E*\d*$/', $cell->getCoordinate())){
$cell->setValueExplicit(Date::excelToDateTimeObject($value)->format('Y-m-d'), DataType::TYPE_STRING);
}
else{
$cell->setValueExplicit($value, DataType::TYPE_STRING);
}
return true;
}
å¿ ããã¹ãŠã®åå空éãã€ã³ããŒãããã€ã³ããŒã¿ãŒã«_WithCustomValueBinder_ãå®è£ ããŠãã ããã
åé¡ããããŸããäžéšã®ã»ã«ã§ä»»æã®å€ïŒæ°å€ãæååãæ¥ä»ãªã©ïŒãæã€ããšãã§ãããã¡ã€ã«ãã€ã³ããŒãããŠããŸãããã®ã»ã«ã®å ã®å€ãæ¥ä»ã§ãã£ãããšãã©ã®ããã«ç¥ãããšãã§ããã®ã§ããã©ãŒãããã§ããŸããæ£ããïŒ
ã©ã®åã«æ¥ä»ãšã³ããªãå«ãŸããããå ·äœçã«ææ¡ããŠãããä¿®æ£ã§åããã®ãåç §ããå¿ èŠããããŸãã èŠåºãã䜿çšããŠããå Žåã¯ãåããŒã§ç¢ºèªã§ããŸãã äžè¬ã«ãæ¥ä»å€ãäžè¬çã«ææ¡ããã®ã¯ç°¡åã§ãããExcelã䜿çšãããšãåºæ¬çã«æååã§ããExcelã¿ã€ã ã¹ã¿ã³ããšããŠæ¥ä»ãæ ŒçŽãããŸãã ã§ããããšã¯ãã¿ã€ã ã¹ã¿ã³ãã®ãã¿ãŒã³ãææ¡ããããã«å¿ããŠååããã§ãã¯ããããšã§ããäžèŽãããã®ãããå Žåã¯ããã©ãŒããããããã«é²ããããšãã§ããŸãã
ç§ãèŠããšãããExcelã®ã¿ã€ã ã¹ã¿ã³ãã¯ãäžè¬ã«_ \ d * \ã\ d _ã®ãã¿ãŒã³ãæã£ãŠããŸã
ã圹ã«ç«ãŠã°å¹žãã§ãã
ããã¯äžå¯èœã§ãããã®åã®ããŒã¿ã¯ä»»æã®å€ã¿ã€ãïŒæ°å€ãæ¥ä»ãæååïŒãæã€ããšãã§ããäºåã«ç¥ãããšã¯ã§ããŸããããã®ããŒã¿ã¯æçµçã«jsonãã£ãŒã«ãã«èªã¿èŸŒãŸããŸãã ãããŠãããã¯å®å šã«42434.12ã®ãããªå€ã§ãããæ¥ä»ã§ã¯ãªãå¯èœæ§ããããŸãã
ç§ã¯PRã«åãçµã¿å§ããŸããããå®è£ ãè€éã«ãªãããšã«ããã«æ°ã¥ããŸããã @patrickbrouwersã¯ã³ãŒãããŒã¹ãã¬ãã¥ãŒããŠãä»åŸã®æåã®æ¹æ³ã確èªããããšããŠããŸããã
ãããŸã§ã®éãImportãªããžã§ã¯ãã§ãã«ããŒã¡ãœããã䜿çšããŠããŸãã
/** * Transform a date value into a Carbon object. * * <strong i="9">@return</strong> \Carbon\Carbon|null */ public function transformDate($value, $format = 'Y-m-d') { try { return \Carbon\Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value)); } catch (\ErrorException $e) { return \Carbon\Carbon::createFromFormat($format, $value); } }
class Sample implements ToModel { public function model(array $row) { return new user([ 'name' => $row[0], 'email' => $row[1], 'birth-date' => $this->transformDate($row[2]), ]); } }
ãã£ãŒã ã®ããã«æ©èœããŸãã ããããšãããããŸãã
@ vin33t @patrickbrouwers
æåã«ïŒtry / catchã®åã«ïŒç©ºã®ãã£ãŒã«ãã確èªããŠãã ãããããã§ãªãå Žåãé¢æ°ã¯ç©ºã®å Žåã«æ¥ä»1970-01-01ãè¿ããŸãã
if(!strlen($value)) return null;
ããã«ã¡ã¯ãç§ã¯ãã®è§£æ±ºçãèŠã€ããŸãããç§ã®ããã«åããŸãïŒ
protected function formatDateExcel($date){
if (gettype($date) === 'double') {
$birthday = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($date);
return $birthday->format('n/j/Y');
}
return $date;
}
ãããŠç§ã¯äœ¿çšããŸã
$this->formatDateExcel($row['birthday']);
m/d/Y
ãã©ãŒãããã®ããã«04/04/1977
ãåŠçããæ¹æ³ã誰ã§ã説æã§ããŸããïŒ
Date::excelToDateTimeObject($row['birth_date'])
ç§ãèŠãããã«ãããã¯ãã©ãŒãããåŒæ°ãåãå ¥ããŸãããïŒ
ãã¢çšïŒ
'birthday' => $row['birth_date'] ? Date::excelToDateTimeObject($row['birth_date']) : null,
ãããŠãã¡ããã 04/04/1977
ããããŸãã 0000-00-00....
04/04/1977
ãååŸããŸããããã¯ãæãšæ¥ãããããªãããã§ãïŒman_facepalmingïŒ
æŽæ°ïŒ
æ°ã«ããªãã§ãã ããåé¡ã¯1970幎以äžã®èªçæ¥ã®äººã
ã ãã®ãã®ã§ããããšãå€æããŸãã...
2åç®ã®ç·šéã§ãåã¿ã€ããtimestamp
ããdateTime
-ã±ãŒã¹ã¯ã¯ããŒãºãããŸããã
æ¥ä»ãã£ãŒã«ããå«ãExcelãã¡ã€ã«ãã€ã³ããŒããããã®ã§ããã1992/03/01ã®åœ¢åŒãš1992-03-01ã®éã«ãšã©ãŒããããŸããããããšããããå
æããå¥ã®æ¹æ³ããããŸããïŒ
ãã®åé¡ãå
æããã®ãæäŒã£ãŠãã ããã
æ¥ä»ãã£ãŒã«ããå«ãExcelãã¡ã€ã«ãã€ã³ããŒããããã®ã§ããã1992/03/01ã®åœ¢åŒãš1992-03-01ã®éã«ãšã©ãŒããããŸããããããšããããå æããå¥ã®æ¹æ³ããããŸããïŒ
ãã®åé¡ãå æããã®ãæäŒã£ãŠãã ããã
ããã«ã¡ã¯ãã¶ã«ããã
ãã®ããã«ãExcelãã¡ã€ã«ã§æ¥ä»ãã£ãŒã«ã1992-03-01ã®åã§ç·šéããŠã¿ãŠãã ããã
ãã®æ¥ä»1992-03-01ã¯LaravelExcelã§åãå
¥ããããªããããåãã£ãŒã«ãã¿ã€ããæŽæ°/å€æŽããå¿
èŠããããŸãã
解決ããã¹ãããïŒ-
1ïŒã€ã³ããŒãããExcelãã¡ã€ã«ãéããŸãã æ¥ä»åãéžæããŸãå³ã¯ãªãã¯ããŠããã©ãŒãããã»ã«ãéžæããŸã
2ïŒãã©ãŒãããã»ã«>æ°å€>ã«ã¹ã¿ã >ã¿ã€ã> dd-mm-yyyy hhïŒmmïŒss
ãµã³ãã«ã¯æ¬¡ã®ããã«ãªããŸã> 03-06-2018 00:00:00
ãã©ãŒãããã»ã«ãå€æŽããåŸã 2018幎3æ6æ¥ã®ããã«è¡šç€ºãããŠããå Žåã
ãããããã«ã¯ãªãã¯ããŠã03-06-201800ïŒ00ïŒ00ã®ããã«å€æŽããŠãã ããã
ããäžåºŠãã¡ã€ã«ãã€ã³ããŒã....ããã§ããŸãããããšãé¡ã£ãŠããŸãã
æ¥ä»ãã£ãŒã«ããå«ãExcelãã¡ã€ã«ãã€ã³ããŒããããã®ã§ããã1992/03/01ã®åœ¢åŒãš1992-03-01ã®éã«ãšã©ãŒããããŸããããããšããããå æããå¥ã®æ¹æ³ããããŸããïŒ
ãã®åé¡ãå æããã®ãæäŒã£ãŠãã ãããããã«ã¡ã¯ãã¶ã«ããã
ãã®ããã«ãExcelãã¡ã€ã«ã§æ¥ä»ãã£ãŒã«ã1992-03-01ã®åã§ç·šéããŠã¿ãŠãã ããã
ãã®æ¥ä»1992-03-01ã¯LaravelExcelã§åãå ¥ããããªããããåãã£ãŒã«ãã¿ã€ããæŽæ°/å€æŽããå¿ èŠããããŸãã
解決ããã¹ãããïŒ-
- ã€ã³ããŒãããExcelãã¡ã€ã«ãéããŸãã æ¥ä»åãéžæããŸãå³ã¯ãªãã¯ããŠããã©ãŒãããã»ã«ãéžæããŸã
- ãã©ãŒãããã»ã«>æ°å€>ã«ã¹ã¿ã >ã¿ã€ã> dd-mm-yyyy hhïŒmmïŒss
ãµã³ãã«ã¯æ¬¡ã®ããã«ãªããŸã> 03-06-2018 00:00:00
ãã©ãŒãããã»ã«ãå€æŽããåŸã 2018幎3æ6æ¥ã®ããã«è¡šç€ºãããŠããå Žåã
ãããããã«ã¯ãªãã¯ããŠã03-06-201800ïŒ00ïŒ00ã®ããã«å€æŽããŠãã ãããããäžåºŠãã¡ã€ã«ãã€ã³ããŒã....ããã§ããŸãããããšãé¡ã£ãŠããŸãã
Excelã§æ¥ä»ã¿ã€ããå€æŽããåŸãåã³åé¡ãçºçããŸããã«ãŒãã³ãã¹ãããã䜿çšããã«ã¯ã©ãããã°ããã§ããïŒ
ã§ã¯ãæ¥ä»ãŸãã¯æ¥æãªããžã§ã¯ãã«å€æããå¿ èŠããããã©ãããå€æããåã«ãã»ã«ãæ¥ä»åœ¢åŒã§ããããšã確èªããæ¹æ³ã誰ããèãåºããããšããããŸããïŒ ã¹ãã¬ããã·ãŒããExcelã«å床èªã¿èŸŒãŸãããšãä¿åãããæ¥ä»ãã£ãŒã«ããæ¥ä»ãã£ãŒã«ããšããŠè¿ããããããExcelã¯æããã«èªèããŠããŸãã ãããã£ãŠããã®ã»ã«ã«ã¯ãæ¥ä»ãå«ãã»ã«ã§ããããšããããã¡ã¿ããŒã¿ãå¿ èŠã§ãã
ã¡ãã£ãšèŠããŠã¿ãããã¯ãŒã¯ã·ãŒãã«ãããŸãã
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" mc:Ignorable="x14ac xr xr2 xr3" xr:uid="{A7382266-55D2-4E6B-95C9-90E61705D12D}">
...
<sheetData>
<row r="4" spans="1:1" x14ac:dyDescent="0.25">
<c r="A4">
<v>54321</v>
</c>
</row>
<row r="5" spans="1:1" x14ac:dyDescent="0.25">
<c r="A5" s="1">
<v>43924</v>
</c>
</row>
</sheetData>
...
</worksheet>
ã»ã«A4ã¯æŽæ°ã§ãã»ã«A5ã¯æ¥ä»ã§ãã ç°ãªãã®ã¯s="1"
å±æ§ã§ãã ããã¯ãããæ¥ä»ã«ããŸãã Book1.xlsx
ç·šéããŠãã®å±æ§ãã»ã«A4ã«è¿œå ãããšãã¹ãã¬ããã·ãŒããéããš2ã€ã®æ¥ä»ã衚瀺ãããŸãã 54321ã¯ãçåã«æã£ãŠããæ¹ã®ããã«ã2048幎9æ20æ¥ã§ã;-)
ãããã£ãŠãããŒã¿ã¯ã¹ãã¬ããã·ãŒãã«ããããã®çªå·ã¯çªå·ã§ã¯ãªãæ¥ä»ã§ããããšããã®ã©ã€ãã©ãªã«éç¥ããŸãã ç§ã¯ãããä»æ§ã§èª¿ã¹ãŠããªãã®ã§ãããããã埮åŠãªããšãé¢ä¿ããŠãããšæããŸãããèŠç¹ã¯ãã¹ãã¬ããã·ãŒããã€ã³ããŒãããã¢ããªã±ãŒã·ã§ã³ã¯ãããŒã¿åãäœã§ããããäºåã«ç¥ãå¿ èŠããªããšããããšã§ãã
æŽæ°ïŒããã§æ¬åœã«çŽ æŽãããçãs=1
ã¯ã styles.xml
ã§ããã€ãã®ãªãã€ã¬ã¯ãåç
§ãééããæçµçã«å
éšåœ¢åŒãŸãã¯ã«ã¹ã¿ã 圢åŒãæäŸããŸãã æ°åãæ¥ä»ã«ããã€ããã ã£ãã®ãã©ãããå€æããããã«å¿
èŠãªã®ã¯ã衚瀺圢åŒã ãã ãšæããŸãã äžéšã®å
éšåœ¢åŒã¯ããŒãã³ãŒãã£ã³ã°ããã®ã«ååç°¡åã§ãããã«ã¹ã¿ã 圢åŒã¯ãã³ãŒããå°ãé£ãããªããŸãã
PhpSpreadsheetã¯ãã®ãã©ãŒãããã«ã€ããŠç¥ã£ãŠããŸãã ãã ããããã©ãŒãã³ã¹äžã®çç±ãããExcelãã¡ã€ã«ãread_onlyã¢ãŒãã§èªã¿åãããšããå§ãããŸãã ããã§ç¡å¹ã«ã§ããå ŽåïŒ https ïŒ PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($date)
ã䜿çšããŠèªåã§æ¥ä»ããã©ãŒãããã§ããŸãã
ãã¹ããããŠããŸãããã次ã®ããšãè¡ãå¿ èŠããããšæããŸãã
return new user([ 'UserName' => $row['UserName'], 'Password' => $row['Password'], 'date' => \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['date']), ]);
setReadDataOnly
ãä»ã®ç¶æ³ã§åé¡ãåŒãèµ·ããããšãèŠããŠããã®ã§ããããããäžåºŠè¿œå ããã ãã§ã¯æ°ãé²ãŸãªãã ãããããããããªããã€ã³ã®æžå¿µäºé ãäœãã«ããããšãã§ããŸãã
æ²ããããšã«ããã®æ¹æ³ã¯ç§ã®æ¥ä»ã1900-01-08ã«å€æŽããŸã
æ¥æãã£ãŒã«ããåçã«è§£æ±ºããå¿ èŠãããå Žåã¯ãå€ãæ¥æã§ãããã©ãããåçã«èªåçã«æ€åºããã¡ãœãããäœæããŸããïŒãã®åã«æ¥æããããã©ããã«é¢ä¿ãªãïŒããŸãã¯ããŸããŸãªæ¹æ³ãè©ŠããŸããããŒã¿åãšããã¯æ£åžžã«åäœããŸã
/**
* <strong i="6">@param</strong> Cell $cell
* <strong i="7">@param</strong> $value
*
* <strong i="8">@return</strong> boolean;
*/
public function bindValue(Cell $cell, $value)
{
$formatedCellValue = $this->formatDateTimeCell($value, $datetime_output_format = "d-m-Y H:i:s", $date_output_format = "d-m-Y", $time_output_format = "H:i:s" );
if($formatedCellValue != false){
$cell->setValueExplicit($formatedCellValue, DataType::TYPE_STRING);
return true;
}
// else return default behavior
return parent::bindValue($cell, $value);
}
/**
*
* Convert excel-timestamp to Php-timestamp and again to excel-timestamp to compare both compare
* By Leonardo J. Jauregui ( <strong i="9">@Nanod10</strong> | siskit dot com )
*
* <strong i="10">@param</strong> $value (cell value)
* <strong i="11">@param</strong> String $datetime_output_format
* <strong i="12">@param</strong> String $date_output_format
* <strong i="13">@param</strong> String $time_output_format
*
* <strong i="14">@return</strong> $formatedCellValue
*/
private function formatDateTimeCell( $value, $datetime_output_format = "Y-m-d H:i:s", $date_output_format = "Y-m-d", $time_output_format = "H:i:s" )
{
// is only time flag
$is_only_time = false;
// Divide Excel-timestamp to know if is Only Date, Only Time or both of them
$excel_datetime_exploded = explode(".", $value);
// if has dot, maybe date has time or is only time
if(strstr($value,".")){
// Excel-timestamp to Php-DateTimeObject
$dateTimeObject = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
// if Excel-timestamp > 0 then has Date and Time
if(intval($excel_datetime_exploded[0]) > 0){
// Date and Time
$output_format = $datetime_output_format;
$is_only_time = false;
}else{
// Only time
$output_format = $time_output_format;
$is_only_time = true;
}
}else{
// Only Date
// Excel-timestamp to Php-DateTimeObject
$dateTimeObject = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
$output_format = $date_output_format;
$is_only_time = false;
}
// Php-DateTimeObject to Php-timestamp
$phpTimestamp = $dateTimeObject->getTimestamp();
// Php-timestamp to Excel-timestamp
$excelTimestamp = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel( $phpTimestamp );
// if is only Time
if($is_only_time){
// 01-01-1970 = 25569
// Substract to match PhpToExcel conversion
$excelTimestamp = $excelTimestamp - 25569;
}
/*
// uncoment to debug manualy and see if working
$debug_arr = [
"value"=>$value,
"value_float"=>floatval($value),
"dateTimeObject"=>$dateTimeObject,
"phpTimestamp"=>$phpTimestamp,
"excelTimestamp"=>$excelTimestamp,
"default_date_format"=>$dateTimeObject->format('Y-m-d H:i:s'),
"custom_date_format"=>$dateTimeObject->format($output_format)
];
if($cell->getColumn()=="Q"){
if($cell->getRow()=="2"){
if(floatval($value)===$excelTimestamp){
dd($debug_arr);
}
}
}
*/
// if the values match
if( floatval($value) === $excelTimestamp ){
// is a fucking date! ;)
$formatedCellValue = $dateTimeObject->format($output_format);
return $formatedCellValue;
}else{
// return normal value
return false;
}
}
ããã«ã¡ã¯ã åãåé¡ããããŸãã ToCollectionã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠããŸãã
ã¡ãœããpublic function collection(Collection $collection)
ã¯ãokãšå®£èšãããŠåŒã³åºããããã¹ãŠã®åŠçãè¡ãããŸãã
åé¡ïŒcollectionïŒïŒã¡ãœããã§ã1ã€ã®æ¥æã»ã«ãæ¥ææååã§ã¯ãªãæ°å€ã«å€æãããŸãã ãã®å€æãç¡å¹ã«ããã«ã¯ã©ãããã°ããã§ããïŒ å€ã®åœ¢åŒãç解ããŠããŸããã ãããŠããšã«ããXLSãã¡ã€ã«ãå€æŽããããšã¯ã§ããŸããã
class MyImport implements WithCustomValueBinder, ToCollection
â collectionïŒïŒ;ã®åã«bindValuesãåŒã³åºãããªããããã©ã¡ããæ©èœããŸããã
ToModelãã§ã«å®è£ ãããŠããã³ã¬ã¯ã·ã§ã³ïŒïŒã®ããã䜿çšã§ããŸããã ãŸããXLSã®åœ¢åŒã¯ç·åœ¢ã§ã¯ãããŸããã ã«ã¹ã¿ã åŠçãå¿ èŠã§ãã
ããã«ã¡ã¯ãããã§åæ§ã®åé¡ã laravelã®ããªããŒã¿ãŒã䜿çšããŠãç¹å®ã®æ¥ä»åœ¢åŒããã§ãã¯ãããããå¥ã®æ¥ä»ãã£ãŒã«ãã®åã«ããããšã確èªãããã£ãã®ã§ãã ããã¯ã©ããããããå¯èœã§ããïŒ ç§ããããŸã§ã«èŠã€ããå¯äžã®è§£æ±ºçã¯ãæ¥æã»ã«ãæååãšããŠxlsxãã¡ã€ã«ã«ä¿åãã次ã®ããã«ããªããŒã¿ãŒãå®è¡ããããšã§ãã
public function rules(): array
{
return [
'start' => 'required|date_format:d/m/y H:i|before:*.end',
'end' => 'required|date_format:d/m/y H:i|after:*.end',
];
}
ã¯ããã»ã«åœ¢åŒãæåã§æååã«å€æŽããŠãããæ£åžžã«è§£æããŸãã ãã ããxlsãã¡ã€ã«ã¯ã»ã«åœ¢åŒã®Datetemeã§å®æçã«ã¹ããªãŒãã³ã°ããããããåžžã«å€æŽã§ããããã§ã¯ãããŸããã
åé¡ã¯ãŸã 解決ããŠããŸããã
æãåèã«ãªãã³ã¡ã³ã
ç§ã¯PRã«åãçµã¿å§ããŸããããå®è£ ãè€éã«ãªãããšã«ããã«æ°ã¥ããŸããã @patrickbrouwersã¯ã³ãŒãããŒã¹ãã¬ãã¥ãŒããŠãä»åŸã®æåã®æ¹æ³ã確èªããããšããŠããŸããã
ãããŸã§ã®éãImportãªããžã§ã¯ãã§ãã«ããŒã¡ãœããã䜿çšããŠããŸãã