PHP

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

Freebird

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.

PHP

5 komentarzy

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

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

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

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;#)

usunąłem spacje i poprawiłem tabelki

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