Autor Zpráva
hellmc
Profil
Ahoyte, potrebujem exporovat data z databazy do xlsx, vsetko funguje ok, problem je zapis datumu, namiesto napr 1.1.2001 sa otvara v openoffice ako '1.1.2001 ... s apostofom, co berie ako string, myslim ... nebudem vypisovat cely kod, ide o to,ze z mysqli query vygeneruje xls ... mam to asi takto >

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

$spreadsheet->getActiveSheet()->getStyle('G3')->getNumberFormat()->setFormatCode('DD.MM.YYYY H:i:s');
$datum=$hodnota_riadku; /*=DATUM z DB*/
$date = new DateTime($datum);
$dateTime=$date->getTimestamp();
$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($dateTime );
$sheet->setCellValue('G3',$excelDateValue);
                  

ked napisem rucne $datum, zobrazi to ok, problem je ked tam zapisujem hodnotu z db, zobrazi to aktualny datum -1h ... uz fuckt neviem, dik za pomoc
blaaablaaa
Profil
hellmc:
Nejspíš bude problém s časovou zónou. Zkus k výslednému timestampu přičíst/odečíst posun časové zóny.
hellmc
Profil
blaaablaaa:
Dik za odpoved, ale problem nie je s casovou zonou, to by som posunul, problem je ze ked napisem rucne napr. $datum="2017-01-01 10:00:01" ... zobrazi sa v poriadku a naformatovany, ked ale dam $datum =$hodnota_riadku, co je datum z databazy zobrazi aktualny datum teda teraz je napr 2022-2-16 14:20:25 ... ako keby som napisal date("now")

Dik ... pekny den
anonym_
Profil *
hellmc:
problem nie je s casovou zonou
Podle původního příspěvku, kde ti hapruje právě jedna hodina, to tak vypadá. Že máš špatnou timezone v databázi.

ked ale dam $datum =$hodnota_riadku
Co je v proměnné $hodnota_riadku?

napr 2022-2-16 14:20:25
Toto není formát data, který by lezl z databáze.
Keeehi
Profil
anonym:
Co je v proměnné $hodnota_riadku?
Doplním, ideálně kdybys napsal výstup z var_dump($hodnota_riadku);
hellmc
Profil
Keeehi:
var dump $hodnota_riadku mi vratil >string '2022-01-17 16:29:21' length(19)

ale v openOffice zobrazi > 16.02.2022 14:02:05
blaaablaaa
Profil
hellmc:
Podle dokumentace umí metoda PHPToExcel zpracovat i string nebo DateTime objekt.

Co udělé tohle?
$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($date);
případně
$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($date->format('Y-m-d H:i:s'));
$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($date->format('d.m.Y H:i:s'));

Případně co vypíše var_dump($excelDateValue);?
hellmc
Profil
blaaablaaa:
$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($date); vrati 16.02.2022 14:15:05

$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($date->format('Y-m-d H:i:s')); > Uncaught Error: Call to a member function format() on int

var_dump($excelDateValue) > float 44578.687048611 .... hm
Kajman
Profil
hellmc:
Jasně, protože té metodě nemáte dávat timestamp, ale objekt DateTime nebo string
phpoffice.github.io/PhpSpreadsheet/classes/PhpOffice-PhpSpreadsheet-Shared-Date.html#method_PHPToExcel

Edit: podle hlášky tam stále cpete číslo, takže v $date je něco jiného, než očekáváme dle kódu v [#1]
Kajman
Profil
Ještě poznámka. Excel má dva formáty datumů 1900 a 1904, a někdy zlobí kopírování dat z jednoho sešitu do druhého, pokud nejsou formáty sjednocené. Raději si to pak ještě vyzkoušejte, dokud se v tom vrtáte.
hellmc
Profil
Kajman:
Takze prosim ako osetrit hodnotu datum na date ... skusil som $excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel(date('d.m.Y H:i:s',strtotime($datum))); co mi vrati 1.1.1970 ... cize 0 asi

$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($date); vrati aktualny datum nie db datum
Kajman
Profil
Toto funguje?
$datum = '2022-01-17 16:29:21';
$date = new DateTime($datum);
$excelDateValue = \PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel($date);
hellmc
Profil
Kajman:
Jop ... to je ok .. takto to funguje
hellmc
Profil
hellmc:
Som trubka ... zabudol som v podmienke dat else ... funguje to squele ... dik moc za tvoj čas ... pozval by som ťa na pivo ... keby sa dalo ... este raz dik

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0