
Создание файла XLSX на PHP без сторонних библиотек

Создание файла XLSX на PHP без сторонних библиотек
В предыдущей статье я рассказал, как можно легко извлекать данные из файлов в формате XLSX. Раз можно извлекать, значит можно и генерировать такие файлы, тем более, что их формат уже разобран. Если требуется создавать файлы только со статичными данными, без формул, сводных таблиц, графиков и прочей красоты, то совсем не обязательно таскать тяжеленные библиотеки, можно воспользоваться приведенным в статье кодом.
Из PHPExcel я позаимствовал функцию, которая на входе получает линейный номер столбца, а на выходе возвращает буквенный номер столбца в экселевском представлении. Она нам понадобится для генерации XML-файла.
Code (PHP) : Убрать нумерацию
- function num2cell($col=0) {
- static $cell_cache = array();
- if (!isset($cell_cache[$col])) {
- if ($col<26) {
- $cell=chr(65+$col);
- }
- elseif ($col<702) {
- $cell=chr(64+($col/26)).
- chr(65+$col % 26);
- }
- else {
- $cell=chr(64+(($col-26)/676)).
- chr(65+((($col-26)%676)/26)).
- chr(65+$col%26);
- }
- $cell_cache[$col]=$cell;
- }
- else {
- $cell=$cell_cache[$col];
- }
- return $cell;
- }
Code (PHP) : Убрать нумерацию
- $data=array();
- for($y=0; $y<40000; $y++) {
- for($x=0; $x<100; $x++) {
- if (rand(0,100)<50) {
- $data[$y][$x]=rand(0,1000000);
- }
- else {
- $data[$y][$x]='Cell '.rand(0,100);
- }
- }
- }
Создание книги выполняется в несколько этапов. Как вы помните по предыдущей статье, строковые значения ячеек хранятся в отдельном файле sharedStrings.xml, а числовые значения и ссылки на строки записываются в файлы листов типа sheet1.xml. Поэтому первым действием будет извлечение уникальных строк из массива данных. Тут строки используются в качестве ключей массива, но беспокоиться об этом не надо, в PHP ключи массива спокойно могут достигать 128 мегабайт.
Code (PHP) : Убрать нумерацию
- // Предобработка: извлечение строк из массива данных
- $words=array();
- foreach ($data as $row=>$cols) {
- foreach($cols as $col=>$value) {
- if (is_string($value)) {
- if (!isset($words[$value])) {
- $words[$value]=count($words);
- }
- }
- }
- }
Code (PHP) : Убрать нумерацию
- // Запись первого листа книги
- $f=fopen('sheet1.xml','w+');
- $xml='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
- xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="x14ac"
- xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
- <sheetViews>
- <sheetView tabSelected="1" workbookViewId="0" />
- </sheetViews>
- <sheetData>';
- fwrite($f,$xml);
- for($y=0; $y<count($data); $y++) {
- $xml='<row r="'.($y+1).'" spans="1:1">';
- fwrite($f,$xml);
- for($x=0; $x<count($data[$y]); $x++) {
- $val=$data[$y][$x];
- $r=num2cell($x).($y+1);
- if (isset($words[$val])) {
- $xml='<c r="'.$r.'" t="s"><v>'.$words[$val].'</v></c>';
- }
- else {
- $xml='<c r="'.$r.'"><v>'.$val.'</v></c>';
- }
- fwrite($f,$xml);
- }
- $xml='</row>';
- fwrite($f,$xml);
- }
- $xml='</sheetData>
- </worksheet>';
- fwrite($f,$xml);
- fclose($f);
Еще было бы неплохо поэкспериментировать со строками на предмет наличия в них всяких HTML-тегов, служебных символов, пустых строк и всякого такого. У меня формат исходных данных известен, так что такие проверки и преобразования выполнять не придется.
Code (PHP) : Убрать нумерацию
- // Запись строковых данных
- $f=fopen('sharedStrings.xml','w+');
- $xml='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
- count="'.count($words).'"
- uniqueCount="'.count($words).'">';
- fwrite($f,$xml);
- if (count($words)) {
- foreach($words as $k=>$v) {
- $xml='<si><t>'.$k.'</t></si>';
- fwrite($f,$xml);
- }
- }
- $xml='</sst>';
- fwrite($f,$xml);
- fclose($f);
Code (PHP) : Убрать нумерацию
- // Упаковка файлов в книгу
- $z=new ZipArchive();
- $z->open('file.xlsx',ZipArchive::CREATE);
- $z->addFile('sheet1.xml', 'xl/worksheets/sheet1.xml');
- $z->addFile('sharedStrings.xml', 'xl/sharedStrings.xml');
- $z->close();
Просмотров: 1247 | Комментариев: 0
Метки: PHP, полезные функции

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий
Заполните форму для добавления комментария
