Programowanie w języku PHP

Zrzucenie danych z MySQL do plików .xls (EXCEL)

W sumie można się zastanowić, po co zrzucać do arkusza kalkulacyjnego bazę danych. Odpowiedź brzmi - prościej się ją przegląda.

Jak to zrobić, czyli jak zrzucić odpowiednie pola do pliku excelowskiego? Nic prostszego.

Najlepiej zaprezentować to na przykładzie prostej bazy danych:

TABELA USER

| ID | IMIE | NAZWISKO | MIASTO |

| 1 | JAN | KOWALSKI | WA-WA |

| 2 | ULA | NOWAK | LODZ |

| 3 |ROMAN | NAWROCKI | KOLO | ----------------------------------

TABELA USER_WIEK

| ID | DZIEN | MIESIAC | ROK |

| 1 | 22 | 06 | 1999 |

| 2 | 21 | 11 | 1978 |

| 3 | 19 | 09 | 1907 | -------------------------------

Chcemy uzyskać plik z następującymi danymi:

| LP | IMIE | NAZWISKO | ROK URODZNIA |

oczywiście przy założeniu, że każda dana jest w osobnej komórce, a następna seria danych jest w następnym wierszu.

Na początek tworzymy tablice z nagłówkami (nazwami kolumn):

<?
  $naglowki = array (
                              'Lp.',
                              'Imię',
                              'Nazwisko',
                              'Rok urodzenia'
                                );
 
   $nastepny_wiersz = "\n"; // separatory
   $nastepna_kolumna = "\t"; // separatory
 
?>


następnie odczytujemy odpowiednie dane z bazy danych i tworzymy serię danych (cały wiersz)

<?
 
function odczyt($id) {
 
Connect(); // domyślna funkcja do połączenia z bazą
 
$sql="SELECT * FROM user WHERE id='$id' "; // zapytanie o wszystkie pola z tablicy USER gdzie ID będzie równe $id
$query=mysql_query($sql); // wykonanie zapytania
if (!$user=mysql_fetch_array($query)) echo mysql_error(); //odczyt danych z warunkiem jeżeli sie nie powiedzie
 
$sql1="SELECT * FROM user WHERE id='$id' ";
$query1=mysql_query($sql1);
if (!$user_wiek=mysql_fetch_array($query1)) echo mysql_error();
 
  $seria = array (
                              $id,
                              $user['imie'],
                              $user['nazwisko'],
                              $user_wiek['rok'],
                              $następny_wiersz
                                );
 
return $seria;
}
?>



nasza funkcja ODCZYT($ID) zwraca nam cały wiersz danych, teraz należy umieścić tę funkcję w pętli i gotowe.


<?
 
if($plik = fopen("moj_plik.xls", "wb")) // utworzenie pliku
                                echo "<br>PLIK ZOSTAŁ UTWORZONY !!! ";
                                else
                                echo "Błąd tworzenia pliku !!!";
 
 
 
                foreach ($naglowki as $pole) { // pętla odczytująca tylko tablice
                         $dane.="$pole $nastepna_kolumna"; // zmienna $dane się zapełnia
 
                             }
 
 
 
 $sql="SELECT id FROM user";
  $query=mysql_query($sql);
 
while ($numer=mysql_fetch_array($query))
 
            foreach (odczyt($numer['id']) as $pole) { // pętla odczytująca tylko tablice
                         $dane.="$pole $nastepna_kolumna"; // zmienna $dane się zapełnia
                        $dane.=$nastepny_wiersz;
                             }
 
 
 fputs($plik, $dane); //zapisanie danych w pliku
 
 fclose($plik); //zamknięcie pliku
 
?>


Dowolnie zmieniając funkcję ODCZYT() oraz tablicę $naglowki możemy tworzyć dowolnie zapełniony plik XLS.

5 komentarzy

czarek777 2006-08-25 12:12

Panowie a co ze specyfikacją pliku xls?
Przecież nie można tam sobie wrzucać danych jak do zwykłej tekstówki!!!

Ja używam tego:
http://pear.php.net/package/Spreadsheet_Excel_Writer

czarek777 2006-08-25 12:12

Panowie a co ze specyfikacją pliku xls?
Przecież nie można tam sobie wrzucać danych jak do zwykłej tekstówki!!!

Ja używam tego:
http://pear.php.net/package/Spreadsheet_Excel_Writer

limak 2005-10-11 22:30

no tak, nie ma wielokrotnych zapytan.. .ale i tak mozna namieszac :) pelno przykladów jest w necie do których nie potrzeba zapytan wielokrotnych.

Adamo 2005-10-06 14:44

prgtw - to nie zadziała, po pierwsze to mySQL nie ma możliwości wielokrotnych zapytań więc tylko zwróci błąd - i to jest w sumie wielki plus, a po drugie to i tak raczej user nie ma nadanych praw później do drop table więc by też odmówiło. Co najwyżej można wziąć więcej pozycji niż ustawa przewiduje (\' OR 1=1;#)

Marooned 2005-10-06 01:46

usunąłem spacje i poprawiłem tabelki

p.s.
grr... trza wywalić błąd Coyote z br w pre!