Читаем Excel 2007 (XLSX) при помощи PHP

Ексель легко открыть при помощи PHP

Наверняка многие думают, что Excel формата XLSX очень сложен для чтения и нужно обязательно использовать сложные скрипты и библиотеки. Так было со старым форматом XLS. Для нового экселя – все куда проще. XLSX – это зип архив, внутри которого в виде XML расположены данные по ячейкам и все остальные – в стандартной структуре с малыми хитростями.
Знания этого можно применять для настройки импорта данных из экселя. Любых данных. В дальнейшем мы разберем, как можно самостоятельно создавать эксель файл, не прибегая к супер библиотекам.
Нам понадобятся PHP 5, встроенный модуль ZIP и SimpleXML. Как вы думаете, сколько строк кода нам понадобится?

 

Для примера - расположим файл в папке со скриптом. Назовем его file.xlsx. Из данного файла нам понадобятся файл с данными по первому листу. Он расположен по адресу
file.xlsx/xl/worksheets/sheet1.xml
И файл с частыми строками, сделанный из соображений экономии повторяющихся фраз
file.xlsx/xl/sharedStrings.xml
Нужно считать все строки и вставлять их значения при нахождении ссылки на строку
Сказано – сделано. Создаем ассоциативный массив

$file=file_get_contents('zip://file.xlsx#xl/sharedStrings.xml');
$xml=(array)simplexml_load_string($file);
$sst=array();
foreach ($xml['si'] as $item=>$val)$sst[]=iconv('UTF-8','windows-1251',(string)$val->t);

Первой строкой – мы считываем полный текст распакованного файла внутри архива
Далее – собираем XML структуру в ассоциативный массив
После чего – пробегаемся по элементам массива, записывая значения в итоговый массив $sst. ICONV используется только в случае, если у вас кодировка – не UTF-8
Что дальше? Дальше чуть сложнее. Двумерный массив с возможными ассоциациями

$file=file_get_contents('zip://file.xlsx#xl/worksheets/sheet1.xml');
$xml=simplexml_load_string($file);
$data=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;
        }
    }
    $data[]=$currow;
}

Собираем первый лист. Формируем XML, после чего проходимся по каждой строке row и разбираем каждю ячейку. Для получения атрибутов ячейки – используем свойство attributes(). Если атрибут ‘t’==’s’ – значит значение ячейки – это строка в ассоциативном массиве, полученном ранее.
После сбора строки в массив – соединяем в наш общий массив $data. На самом деле – вместо этого можно было бы сразу добавлять в таблицу, или использовать дополнительные проверки.
Все. Дело сделано. Первый лист прочитан и собран в массив. Сколько строк получилось? 20. Можно было бы сжать сильнее, оптимизировать. Если интересна структура файла – берите архиватор ZIP и смело пытайте XLSX. У вас обязательно получится

Больше материалов выкладываю на своем Дзен канале

  • Автор: kosmom
  • Рейтинг: 0
  • Просмотров: 5903
  • Комментариев: 6
  • Создан: 19.01.2012 14:17

Комментарии (6)

26.12.2014 11:11
Гость

Переменная $sst ничего не делает

26.12.2014 15:36
Гость

А как насчет пустых ячеек ?
Где они ?

05.02.2015 15:29
Гость

Автор, большое спасибо!
Но лучше куски кода было соединить в один - я вот спустя 3 часа понял, что они взаимозависимы ;)

19.11.2015 12:27
Гость

Warning: file_get_contents(zip://file.xlsx#xl/worksheets/sheet1.xml): failed to open stream: operation failed

04.12.2015 15:09
Гость

Вероятно у вас отключено zip extension, необходимый для работы скрипта

23.01.2020 20:20
Гость

Класс! Спасибо автору за точность и краткость.

Ваши предложения и пожелания пишите на pro@kosmom.ru

Теги

ajax axios backup bootstrap core framework eloquent excel home project html ios javascript keep-alive kpi laravel legacy mvp orm php rip scroll solid timestamp undefined vue vuetify watch безопасность биометрический паспорт ваша любаша для путешествий загран на 10 лет загран паспорт загранпаспорт нового образца зимние книги как заполнить анкеты кеширование книги на новый год логирование мцф недвижимость новогодние книги образец заполнения антеты паспорт для путешествий паспорт нового поколения печать продукт проектирование прокси разработка ремонт ремонт в апартаментах ремонт нежилого помещения самокат сдача сколько стоил ремонт апартаментов спорт стандарты таблица финансы хостинг цена ремонта что почитать зимой юзабилити

Случайный пост

23.05.2013 13:15
Как узнать, где остановятся двери в метро