logo

INTERNETNE STORITVE

- IZDELAVA SPLETNIH STRANI - OBLIKOVANJE - PROGRAMIRANJE DODATKOV

PHP - branje Excel (.xls) datoteke - Excel UTF8 branje

Velikokrat se zgodi, da stranka pošljo svojo vsebino v .xls formatu. Excel je za stranko pregleden način urejanja podatkov, ponuja veliko dodatnih opcij sortiranja in filtriranja. Pa je na PHP strani tudi tako enostavno prebrati Excel, kot je stranki urejanje le-tega?

Če poznate PHPExcelReader razred potem je odgovor pritrdilen. Sicer ima nekaj problemov z branjem UTF8 podatkov ter E_STRICT, E_NOTICE napakami, vendar se tudi zato najdejo popravki (zadnja verzijo datoteke, ki vsebuje nekaj popravkov s strani mene in nekaj popravkov glede UTF-8 z različnih spletnih strani je moč najti pod datotekami spodaj).

Branje podatkov v CP1251, izpis v UTF-8:

PHP:
  1. // Create new instance
  2. header('Content-Type: text/html; charset=utf-8');
  3. require_once 'Excel/reader.php';
  4. $excelData = new Spreadsheet_Excel_Reader();
  5. $excelData->setOutputEncoding('UTF-8');
  6. $excelData->read('test.xls');
  7.  
  8. // Define how many rows and columns are there - we will automaticly increase rows and columns at reading
  9. $excelData->sheets[0]['numRows'] = 1;
  10. $excelData->sheets[0]['numCols'] = 1;
  11.  
  12. // Get data
  13. $data = array();
  14. for ($i = 1; $i <= $excelData->sheets[0]['numRows']; $i++) {
  15.     for ($j = 1; $j <= $excelData->sheets[0]['numCols']; $j++) {
  16.         if (isset($excelData->sheets[0]['cells'][$i][$j])) {
  17.             // Add field into data array
  18.             $data[$i][] = $excelData->sheets[0]['cells'][$i][$j];
  19.  
  20.             // If this is first row count number of columns
  21.             if ($i == 1) {
  22.                 $excelData->sheets[0]['numCols']++;
  23.             }
  24.         } elseif ($i !== 1 && $j <$excelData->sheets[0]['numCols']) {
  25.             $data[$i][] = '';
  26.         }
  27.     }
  28.  
  29.     // If the row was not empty continue with reading
  30.     if (!empty($data[$i][0])) {
  31.         $excelData->sheets[0]['numRows']++;
  32.     } else {
  33.         unset($data[$i]);
  34.     }
  35. }

S tem preberemo celotno Excel datoteko. Število vrstic in stolpcev dinamično povečujemo pri branju, kjer preverjamo ali sta stolpec in vrstica prazna. Če nista prazna povečamo število le-teh.

Primer izpisa testne datoteke - s pomočjo dump funkcije:
Izpis excel podatkov, ki smo jih prebrali s PHP Excel Reader

Napredna uporaba:
Omenjeni modul oz. razred podpira tudi branje t.i. raw podatkov in tipa stolpcev. Do teh podatkov pridemo s pomočjo cellInfo ključa v tabeli (PHP array). Primer uporabe za datum:

PHP:
  1. if ($excelData->sheets[0]['cellsInfo'][$i][$j]['type'] == 'date') {
  2.     $excelData->sheets[0]['cells'][$i][$j] = date('Y-m-d', $excelData->sheets[0]['cellsInfo'][$i][$j]['raw']);
  3. }

Tako dobimo iz raw podatka (551232000) pravilno formatiran datum(1987-06-21). Včasih se zgodi, da excel reader prebere datum in doda 1 dan. V tem primeru odšteje 60*60*24 (60 sekund, 60 minut, 24 ur):

PHP:
  1. $excelData->sheets[0]['cells'][$i][$j] = date('Y-m-d', $excelData->sheets[0]['cellsInfo'][$i][$j]['raw']-60*60*24);

Dodatne informacije:

Datoteke:

3x komentirano na “PHP - branje Excel (.xls) datoteke - Excel UTF8 branje”

  1. PHP - pretvorba Excel datoteke v .txt datoteko - Excel to txt converter | .: TRSplet - internetne storitve .: je napisal:

    [...] PHP - branje Excel (.xls) datoteke - Excel UTF8 branje [...]

  2. PHP - Kreiranje Excel datoteke - Pisanje v Excel datoteko - PHP - xls | .: TRSplet - internetne storitve .: je napisal:

    [...] PHP - branje Excel (.xls) datoteke - Excel UTF8 branje [...]

  3. Roky je napisal:

    Dodal par malenkostnih popravkov in dodatni primer za branje in pretvorbo datuma.

Dodaj komentar