Avatar billede dane022 Seniormester
17. september 2024 - 14:48 Der er 8 kommentarer

Datoformat ved eksport til Excel

Hej

Synes jeg har prøvet alle metoder, men jeg kan ikke få et datofelt til at blive vist i datoformat ved eksport til Excel.

Kolonnen "Startdato" er i SQL server formateret som Date. Datoen vises korrekt på siden i format d-m-Y, men alligevel vises den i Excel som f.eks. "2023-11-01 00:00:00".

Kodedel der indsætter data i Excel:    $rowIndex = 2;
    foreach ($rows as $row) {
        $column = 'A';
        foreach ($row as $cell) {
            $sheet->setCellValue($column . $rowIndex, $cell);
            $column++;
        }
        $rowIndex++;
        }

Jeg har prøvet med andre datoer før uden at have problemer. Så jeg ved ikke helt hvad der er anderledes her
Avatar billede ejvindh Ekspert
17. september 2024 - 15:11 #1
Nu er der rimelig meget, der skal gættes på, med det korte uddrag af koden. Men et forsigtigt bud kunne måske være, hvis variablen rummer en datetime i stedet for en date?

Hvis ja, kunne en løsning måske være:
$cell->format( 'd-m-Y' );
eller
date_format($cell,"Y-m-d")
Avatar billede bak Forsker
17. september 2024 - 17:54 #2
Du kan ændre datoformatet i excel.
Jeg har før haft problemet ved direkte import fra SQL.
Avatar billede dane022 Seniormester
17. september 2024 - 19:33 #3
Ejvind: jeg er ikke stærk i det. Hvordan skal koden se ud hvis det skal integreres i den eksisterende kode?

Bak: I Excel ændrer det ikke noget at formatere, da indholdet af cellen er blevet til tekst når excel åbnes
Avatar billede ejvindh Ekspert
18. september 2024 - 08:04 #4
$rowIndex = 2;
    foreach ($rows as $row) {
        $column = 'A';
        foreach ($row as $cell) {
            $reformatedCell = date_format($cell,"Y-m-d")
            $sheet->setCellValue($column . $rowIndex, $reformatedCell);
            $column++;
        }
        $rowIndex++;
        }
Avatar billede dane022 Seniormester
18. september 2024 - 19:59 #5
Får denne fejl: Uncaught TypeError: date_format(): Argument #1 ($object) must be of type DateTimeInterface

Jeg kan lige smide query ind her hvis det hjælper:
SELECT DISTINCT l1.Medarbejdernr, Navn, Ansatdato, Arbejdssted, Stilling, '' AS Kilde, NULL AS Type, NULL AS Plustrin, NULL AS Aarligtbeloeb, NULL AS Maanedsloen, NULL AS Betegnelse, NULL AS Startdato, NULL AS Beloeb
    FROM tabel1 L1
    WHERE l1.Medarbejdernr NOT IN (
        SELECT l2.Medarbejdernr
        FROM tabel2 l2
        WHERE l2.Startdato >= DATEFROMPARTS(YEAR(GETDATE()) - 5, 1, 1) AND l2.startdato < DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AND Aftaleform = 'Individuel aftale')
    UNION ALL
    SELECT L.Medarbejdernr, L.Navn, L.Ansatdato, L.Arbejdssted, L.Stilling, 'Fast løn' AS Kilde, L.Type, L.Plustrin, L.Aarligtbeloeb, L.Maanedsloen, L.Betegnelse, FORMAT(L.Startdato, 'dd-MM-yyyy'), NULL AS Beloeb
    FROM tabel l
    WHERE l.Startdato >= DATEFROMPARTS(YEAR(GETDATE()) - 5, 1, 1) AND startdato < DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AND Aftaleform = 'Individuel aftale'
    UNION ALL
    SELECT E.Medarbejdernr, E.Navn, Ansatdato, E.Arbejdssted, E.Stilling, 'Engangstillæg' AS Kilde, NULL AS Type, NULL AS Plustrin, NULL AS Aarligtbelob, NULL AS Maanedsloen, E.Bemaerkning, E.Startdato, E.Beloeb
    FROM tabel E
    WHERE startdato > DATEADD(YEAR, -5, CAST(YEAR(GETDATE()) AS VARCHAR) + '-01-01') AND startdato < DATEFROMPARTS(YEAR(GETDATE()), 1, 1)
    ORDER BY Arbejdssted, Startdato DESC
Avatar billede ejvindh Ekspert
19. september 2024 - 11:25 #6
Jeg tænker, at den fejlmelding betyder at min analyse ikke var rigtig. Den er nok ikke gemt som datetime, og derfor får du en fejlmelding. Så derfor bør du nok i første omgang tilbageføre til det oprindelige.

Nu er jeg ikke selv superstiv i Excel, men måske kunne problemet stamme fra, at Excel foretrækker at få datoer i den engelske udgave. Altså "yyyy-MM-dd" eller "yyyy/MM/dd"? Jeg kan se at i SQL-kaldet beder du om dem efter den danske model: "dd-MM-yyyy". Det kan du jo prøve at fifle lidt med.

Ellers hvis det stadig bøvler, så prøv evt. at indføre en "echo $cell;" lige før eller efter denne linje:
$sheet->setCellValue($column . $rowIndex, $cell);

Det vil kunne give dig et indtryk af, hvordan din variabel ser ud undervejs i processen. Og måske et bud på, hvad der går galt...
Avatar billede bak Forsker
30. september 2024 - 19:38 #7
Uden at være sikker mener jeg at FORMAT laver en nvarchar type hvis ikke du selv definerer typen. Det vil gøre den til text i excel.
Prøv med FORMAT(L.Startdato, 'dd-MM-yyyy') as date
hvor date så bliver typen
Avatar billede dane022 Seniormester
30. september 2024 - 19:55 #8
Problemet er løst. Problematikken viste sig at være blanke felter der forårsagede konverteringsfejlen. Med en if sætning, blev det løst
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester