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
/**
* 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
- Zapisz kod jako
eksport.phpi podlinkuj na swojej stronie:<a href="eksport.php">Pobierz CSV</a>. - Podmień przykładową tablicę na własne dane albo odkomentuj wariant z bazą danych i dostosuj zapytanie.
- Nagłówki kolumn ustawisz w tablicy
$naglowki_kolumn. - 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
;wfputcsv(). 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).
Podobne skrypty
Bezpieczny upload plików na serwer
Wgrywanie plików z pełnym pakietem zabezpieczeń: biała lista rozszerzeń, kontrola prawdziwego typu MIME (finfo), limit rozmiaru, losowa nazwa pliku i czytelne komunikaty błędów.
średni Zobacz kod → Pliki i obrazyTworzenie miniatur obrazków (GD)
Funkcja generująca miniatury JPEG, PNG i WebP z zachowaniem proporcji i przezroczystości, plus przykład przetworzenia całego katalogu zdjęć naraz.
średni Zobacz kod → Pliki i obrazyListowanie plików w katalogu (strona pobierania)
Czytelna lista plików z wybranego katalogu: rozmiar w KB/MB, data modyfikacji, sortowanie i linki do pobrania. Idealne na prostą stronę „do pobrania".
początkujący Zobacz kod →