Odczyt plików Excel w PHP (import tabel xls xlsx)

Web Design Blog

Kategoria:
Programowanie

Data publikacji:
23 listopada 2019

Autor:
Paweł Mansfeld

Odczyt plików Excel w PHP (import tabel xls xlsx)

Import danych tabelarycznych w aplikacji webowej PHP można zrealizować na wiele sposobów. Istnieją popularne formaty takie jak XML, JSON czy CSV. Import tego rodzaju danych jest wspierany natywnie w PHP i wystarczy praktycznie jedna komenda aby taki plik sparsować do postaci tablicy czy jakiejkolwiek innej, którą przewidział programista.

Jednak najpopularniejszym formatem tabel w środowisku firmowym jak można się domyślić jest Excel. Program Microsoft Excel umożliwia co prawda zapisać arkusz do postaci CSV, ale już samo tłumaczenie, że za każdym razem kiedy trzeba będzie zaimportować dane trzeba

  • potrzebne komórki wyciąć,
  • przenieść do osobnego arkusza,
  • i osobno zapisać w postaci CSV,

jest mało profesjonalne i niewygodne dla użytkownika końcowego. Zresztą każdorazowe przenoszenie na użytkownika jakiejś części przetwarzania danych (wykluczając ograniczenia finansowe) jest nie na miejscu. Parsowanie pliku Excel w PHP można bardzo łatwo wykonać za pomocą wielu bibliotek.

Biblioteka do czytania plików Excel PHP

Jedną z nich jest SimpleXLSX: https://github.com/shuchkin/simplexlsx

Bibliotekę stanowi jeden plik, a jego kod dołączamy do naszego programu za pomocą instrukcji:

<?php
require_once DIR.'/../src/SimpleXLSX.php';

Od tej pory możemy skorzystać z przydatnych funkcji, które całą „brudną robotę” zrobią za nas.

Do celów szkoleniowych stwórzmy sobie jakiś plik Excel z dowolnymi danymi. Aby było trudniej może to być plik z wieloma arkuszami. Ja do tego celu wyeksportuję dane z Analytics:

Do naszego pliku przyklad.php dodajmy (poza powyższą funkcją require_once) taki kod:

if ( $xlsx = SimpleXLSX::parse('dane.xlsx') ) {
    print_r( $xlsx->rows() );
}

Zmienna xlsx przechowuje nam coś takiego:

Jak widać wszystko się dobrze zaimportowało. Rzecz jasna skrypt nie odróżnia które komórki odpowiadają za etykiety a które za właściwe dane. Tego typu inteligentne mechanizmy musimy zaimplementować sami.

A jak rzecz się ma w przypadku plików z wieloma arkuszami do stworzenia których zachęcałem na początku? Wystarczy w argumencie metody rows podać indeks arkusza (liczymy od zera):

Pierwszy arkusz wydrukujemy za pomocą:

print_r($xlsx->rows(0));

A drugi, wystarczy zmienić indeks z 0 na 1:

print_r( $xlsx->rows(1));

Drukowanie tabeli HTML z pliku Excel

Dla przećwiczenia, wydrukujmy sobie tabelę na podstawie danych zawartych w dwóch arkuszach Excela:

if ( $xlsx = SimpleXLSX::parse('dane2.xlsx')) {
 $dim = $xlsx->dimension(0);
 $num_cols = $dim[0];
 $num_rows = $dim[1];
 echo '<h2>'.$xlsx->sheetName(0).'</h2>';
 echo '<table>';
 foreach ( $xlsx->rows(0) as $r ) {
     echo '<tr>';
     for ( $i = 0; $i < $num_cols; $i ++ ) {
         echo '<td>' . ( ! empty( $r[ $i ] ) ? $r[ $i ] : ' ' ) . '</td>';
     }
     echo '</tr>';
 }
 echo '</table>';
 $dim = $xlsx->dimension(1);
 $num_cols = $dim[0];
 $num_rows = $dim[1];
 echo '<h2>'.$xlsx->sheetName(1).'</h2>';
 echo '<table>';
 foreach ( $xlsx->rows(1) as $r ) {
     echo '<tr>';
     for ( $i = 0; $i < $num_cols; $i ++ ) {
         echo '<td>' . ( ! empty( $r[ $i ] ) ? $r[ $i ] : ' ' ) . '</td>';
     }
     echo '</tr>';
 }
 echo '</table>';
 }

Przy okazji poznajemy funkcję dimension zwracającą wymiary poszczególnych arkuszy oraz sheetName() zwracającą nazwę arkusza. Jak widać wszystko działa jak należy:

Import danych z Excela do bazy danych MySQL

Skoro utworzyliśmy tabelkę z danych zawartych w arkuszu, nic nie stoi na przeszkodzie aby dane zawarte w arkuszach Excel wczytać do bazy danych. W tym celu w powyższym kodzie zmieniamy instrukcje echo tak aby wygenerować jeden ciąg typu:

#sql = "INSERT INTO tabela (kolumna1, kolumna2) VALUES 
        ('wartosc11', 'wartosc12'),
        ('wartosc21', 'wartosc22'),
        ('wartosc31', 'wartosc32'),
        ('wartosc41', 'wartosc42'),
        ('wartosc51', 'wartosc52')
       ";

Kiedy poskładamy sobie taki ciąg, wystarczy wykonać:

$query = mysqli_query($dbconn, $sql);

Wykorzystując poradnik na temat uploadu plików na serwer PHP można stworzyć ciekawe narzędzie importujące dane do bazy danych sklepu czy innej aplikacji internetowej.

Podsumowanie

Wykorzystywanie sprawdzonych i dojrzałych technologii ma właśnie tę zaletę, że nie napotkamy jakiekolwiek trudności związane ze znalezieniem gotowej biblioteki realizującej konkretną funkcjonalność. W PHP bez problemu można wczytać dane zapisane w arkuszach Excel. Jeżeli dysponujesz danymi w postaci CSV skorzystaj z poradnika na temat parsowania plików CSV w PHP.

Odczyt plików Excel w PHP (import tabel xls xlsx) Odczyt plików Excel w PHP (import tabel xls xlsx) 4.7 na 5 na podstawie 3 ocen Odczyt plików Excel w PHP (import tabel xls xlsx)

Poprzedni post:

Następny post:

Tagi:
php,


Następny artykuł: