Блог старого компьютера

Блог старого компьютера


Главная PHP Парсим xlsx (exel) на php

Парсим xlsx (exel) на php

16.05.2013 10:50 Администратор PHP
Печать PDF

Так как я уже завел разговор об работе с файлами экселя то продолжу его. В прошлой теме мы парсили xls файл на php, а в этой теме мы с вами будем парсить xlsx файл на php. Для тех кто не знает xls это бинарный файл и просто так его не обработать впрочем мы в этом убедились в прошлой теме (xls файл это файл офиса 2003 года и навернее его более старых версий). А xslx файл это обычный zip архив в котором лежат файлы обычные xml файлы которые вы наверное не раз уже парсили благодаря встроенной в php функции (xlsx это файл 2007 офисного пакета думаю еще 2010).

И так если это zip файл то для работы с ним нам необходимо в первую очередь его распаковать, а уже потом его жулькать и чесать голову. Вы можете распаковать любым для вас удобным способом, я для распаковки использовал библиотекку pclzip.lib.php о не и о работе с ней я писал тут.

Так как моей целью в данном случае было сравнить 2 xlsx файла и в результате вывести новый xls файл который отображал страницу таблицу с разными числами и их разницей, то я загружал сначала файл потом его распаковывал, а потому уже и читал.

Распаковка zip файла после загрузки у меня выглядела таким образом:

require_once('pclzip.lib.php');
$archive = new PclZip('1.xlsx');
if ($archive->extract() == 0) {
die("Error : ".$archive->errorInfo(true));
}

 Далее конечно же шел код который все необходимые данные сливал в один массив. Код выглядел так:

$file=file_get_contents('xl/sharedStrings.xml');
$xml=(array)simplexml_load_string($file);
$sst=array();
foreach ($xml['si'] as $item=>$val)$sst[]=(string)$val->t;

$file=file_get_contents('xl/worksheets/sheet1.xml');
$xml=simplexml_load_string($file);
$data1=array();
foreach ($xml->sheetData->row as $row){
$currow=array();
foreach ($row->c as $c){
$value=(string)$c->v;
$attrs=$c->attributes();
if ($attrs['t']=='s'){
$currow[]=$sst[$value];
}else{
$currow[]=$value;
}
}
$data1[]=$currow;
}

$line = $data1;

 Если внимательно прочитать код то ничего сложного в нем нет. У кого нет цели его даже понимать скажу что необходимая нам информация хранится в 2 xml файлах. В одном на сколко я помню названия столбцов, в другом их цифровые значения. В результате нам надо было все слить в один массив, что сообственно мы и сделали. На выходе как и в прошлый раз мы получаем массив $line в котором хранятся ячейки.

Как правило массив этот потом обходят циклом и забирают все нужное. Вот совбстенно и все выходит что работать с xlsx файлом еще проще чем с xls, так что не надо боятся нового формата. Так же хочу отметить что код использует функцию simplexml_load_string() и если вы используете старую версию php то код у вас не оживет.

Добавить комментарий


Защитный код
Обновить

Поиск

Голосование

Что Вы думаете на счет битрикса?
 

Все материалы раздела