Udostępnij za pośrednictwem


          

PHP i Windows - Odczytywanie plików Excel w PHP przy użyciu biblioteki PHPExcel Udostępnij na: Facebook

Autor: Maciej Wilgucki

Opublikowano: 2011-10-10

Arkusz kalkulacyjny jest jedną z najważniejszych aplikacji, wykorzystywanych w pracy biurowej. Dzięki jego wykorzystaniu mamy możliwość tworzenia zestawień, przeprowadzania obliczeń oraz prezentowania danych. Najpopularniejszym arkuszem kalkulacyjnym jest niewątpliwie Excel. Z powodu swoich licznych zastosowań, poprawna obsługa plików, zapisanych w formacie Excel, jest kluczowa w przypadku aplikacji biznesowych.

PHP niestety nie posiada wbudowanej biblioteki do obsługi plików Excel. Z pomocą przychodzi PHPExcel – zestaw klas, umożliwiających odczytywanie i tworzenie arkuszy kalkulacyjnych. W artykule zostały opisane sposoby odczytu arkuszy kalkulacyjnych przy użyciu wspomnianej biblioteki.

Implementacja

Zanim przystąpisz do poznawania biblioteki PHPExcel, musisz ją pobrać. Znajduje się ona pod adresem http://phpexcel.codeplex.com/. Po pobraniu biblioteki zawartość katalogu Classes, będącego podkatalogiem folderu PHPExcel, wypakowuj do katalogu z bibliotekami znajdującego się w Twojej aplikacji*.* W przypadku Zend Frameworka będzie to katalog library. Następnie możesz dołączyć plik PHPExcel.php, który zarejestruje autoloader.

require_once 'PHPExcel/PHPExcel.php';

Wczytywanie pliku

Pracę z arkuszem kalkulacyjnym rozpocznij od wczytania pliku. PHPExcel umożliwia wczytanie pliku na kilka sposobów.

Najprostszym z nich jest wykorzystanie fabryki, przez co nie musisz nawet wiedzieć, jaki format ma Twój arkusz kalkulacyjny.

Informacja
Mimo iż biblioteka nazywa się PHPExcel, to umożliwia ona odczytywanie plików, zapisanych w formacie ODF, SYLK, Gnumeric oraz CSV. W przypadku Excela mamy możliwość pracy z formatami Excel5, Excel2003XML oraz Excel2007.

 

$fileName = 'Zeszyt.xlsx';
$excel = PHPExcel_IOFactory::load($fileName);

Innym sposobem na wczytanie pliku jest wykorzystanie klasy readera, przeznaczonej dla konkretnego typu pliku.

$fileName = 'Zeszyt.xlsx';
$reader = new PHPExcel_Reader_Excel2007();
$excel = $reader->load($fileName);
Informacja
Każdy z formatów, obsługiwanych przez bibliotekę, posiada dedykowaną klasę readera.

Istnieje również możliwość wykorzystania fabryki, automatycznie wykrywającej . Jest to przydatne w sytuacji, w której nie wiemy, jaki rodzaj pliku będzie wczytywany, a musimy wykonać operacje na obiekcie readera.

$fileName = 'Zeszyt.xlsx';
// określenie typu pliku
$fileType = PHPExcel_IOFactory::identify($fileName);
$reader = PHPExcel_IOFactory::createReader($fileType);
$excel = $reader->load($fileName);
$data = $excel->getActiveSheet()->toArray();

Odczytywanie danych z arkusza kalkulacyjnego

Odczytanie danych z załadowanego pliku jest niezwykle proste.

$data = $excel->getActiveSheet()->toArray();

W wyniku zastosowania powyższego kodu, uzyskasz dwuwymiarową tablicę, w której każdy wiersz będzie odpowiadał wierszowi z pliku. Na uwagę zasługuje tutaj metoda getActiveSheet, wybierająca aktywny arkusz. Jeśli chcesz odczytać dane z innego arkusza, zapisanego w pliku, możesz go wskazać, podając jego nazwę lub indeks. Musisz jednak pamiętać, że indeks zaczyna się od zera.

// pobranie danych z trzeciego arkusza
$data = $excel->getSheet(2)->toArray();

// pobranie danych z arkusza o nazwie Raport
$data = $excel->getSheetByName('Raport')->toArray();

Filtrowanie danych

Jeśli chcesz wykluczyć jakieś kolumny lub wiersze z odczytanych danych, możesz zastosować filtry. Są to klasy implementujące interfejs PHPExcel_Reader_IReadFilter. Interfejs wymusza na klasie filtru implementację metody readCell, wywoływanej dla każdej komórki. Jeśli metoda zwróci wartość true, wówczas dane z komórki zostaną dołączone do danych wynikowych. W przeciwnym wypadku zostaną pominięte.

Jako przykład posłuży prosty filtr, powodujący iż wyświetlona zostanie tylko druga kolumna.

class ExcelFilter implements PHPExcel_Reader_IReadFilter
{
    public function readCell($column, $row, $worksheetName = '')
    {
        if($column == 'B') {
            return true;
        }
        return false;
    }
}

Filtr dodaje się do obiektu readera za pomocą metody setReadFilter.

$fileName = 'Zeszyt.xlsx';
$reader = new PHPExcel_Reader_Excel2007();
$reader->setReadFilter(new ExcelFilter());
$excel = $reader->load($fileName);
$data = $excel->getActiveSheet()->toArray();

Obsługa błędów

Jak na porządną bibliotekę przystało, PHPExcel w przypadku wystąpienia problemów zgłasza wyjątek. Dlatego wszystkie operacje, wykonywane za pomocą tej biblioteki, powinny zostać umieszczone w bloku try catch.

Podsumowanie

Dzięki temu artykułowi zapoznałeś się z podstawowymi sposobami odczytywania danych, zapisanych w arkuszu kalkulacyjnym. Dowiedziałeś się, w jaki sposób wczytać plik oraz zastosować filtry w celu ograniczenia danych. W następnej części dowiesz się, w jaki sposób tworzyć arkusze kalkulacyjne.