Przejdź do treści

Eksport danych do pliku CSV (zgodny z Excelem)

  • Pliki i obrazy
  • poziom: początkujący
  • aktualizacja: 12 lipca 2026

„Wyeksportuj mi to do Excela" — prośba, którą słyszy każdy, kto robi jakikolwiek panel w PHP. Najprostsza odpowiedź to plik CSV. Ten skrypt generuje go w locie i wysyła do przeglądarki jako plik do pobrania — z dwoma trikami, dzięki którym polski Excel pokaże poprawnie i polskie znaki, i kolumny.

PHP 46 linii Pobierz .php
<?php
/**
 * Eksport danych do CSV — skryptyPHP.com
 * Zapisz jako: eksport.php
 * Link na stronie: <a href="eksport.php">Pobierz CSV</a>
 */

// ── DANE DO EKSPORTU ────────────────────────────────────────
// Wariant A: dane z tablicy
$wiersze = [
    ['Jan Kowalski',   'jan@przyklad.pl',   '2026-05-11'],
    ['Anna Nowak',     'anna@przyklad.pl',  '2026-06-02'],
    ['Piotr Wiśniewski', 'piotr@przyklad.pl', '2026-07-01'],
];

// Wariant B: dane z bazy (odkomentuj i dostosuj)
// require 'baza.php';
// $pdo = polacz_z_baza();
// $wiersze = $pdo->query(
//     'SELECT imie, email, DATE(utworzono) FROM uzytkownicy ORDER BY imie'
// )->fetchAll(PDO::FETCH_NUM);

$naglowki_kolumn = ['Imię i nazwisko', 'E-mail', 'Data rejestracji'];
$nazwa_pliku     = 'eksport-' . date('Y-m-d') . '.csv';

// ── WYSYŁKA PLIKU ───────────────────────────────────────────
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="' . $nazwa_pliku . '"');
header('Cache-Control: no-store');

$wyjscie = fopen('php://output', 'w');

// Trik 1: BOM na początku pliku — bez niego Excel pokaże „krzaczki"
// zamiast polskich znaków
fwrite($wyjscie, "\xEF\xBB\xBF");

// Trik 2: separator średnik — polski Excel dzieli kolumny po ';'
// (przecinek jest u nas separatorem dziesiętnym)
fputcsv($wyjscie, $naglowki_kolumn, ';', '"', '');

foreach ($wiersze as $wiersz) {
    fputcsv($wyjscie, $wiersz, ';', '"', '');
}

fclose($wyjscie);
exit; // nic więcej nie może trafić do pliku

Jak użyć tego skryptu

  1. Zapisz kod jako eksport.php i podlinkuj na swojej stronie: <a href="eksport.php">Pobierz CSV</a>.
  2. Podmień przykładową tablicę na własne dane albo odkomentuj wariant z bazą danych i dostosuj zapytanie.
  3. Nagłówki kolumn ustawisz w tablicy $naglowki_kolumn.
  4. Przed header() nie może pojawić się żaden znak wyjścia (echo, spacja przed <?php) — inaczej zobaczysz błąd „headers already sent".

Warto wiedzieć

  • BOM (3 bajty EF BB BF) mówi Excelowi, że plik jest w UTF-8. Bez niego polskie znaki wyświetlą się jako krzaczki — to najczęstszy problem z CSV.
  • W polskich ustawieniach regionalnych Excel oczekuje średnika jako separatora — stąd ; w fputcsv(). Do importu w innych systemach (np. amerykańskich) użyj przecinka.
  • fputcsv() sam otacza cudzysłowami wartości zawierające separator lub nowe linie — nie musisz nic dodatkowo zabezpieczać.
  • Piąty parametr (znak maskujący) ustawiamy na pusty string — to zalecane ustawienie, które wyłącza niestandardowe zachowanie PHP i daje w pełni zgodny CSV (w PHP 8.4+ pozbywa się też ostrzeżenia o wartości domyślnej).
#csv #excel #eksport #fputcsv #bom

Podobne skrypty