Я достигаю этого быстрым, своего рода дешёвым способом - потому что он длинный и сложный, я просто объясню это в концепции, а не в коде.
XLSX придерживается ISO 29500, который доступен для всех, если вы хотитеманипулировать документ тщательно в php.В противном случае, следует понимать, что xlsx-файлы - это архивные файлы из набора xml-файлов.
Создайте нужный шаблон, например, с чередующимися строками со стилями разных типов, сделав его в Excel или в открытом XML-редакторе.некоторое описание.Убедитесь, что вы поместили туда некоторые данные и убедитесь, что некоторые поля равны (только для целей обучения).
Затем сохраните ваш файл как xlsx, переименуйте его в .zip или откройте в экстракторе архива и наблюдайтесодержимое.
Во-первых, обратите внимание на файл [Content_Types] .xml, в котором описано расположение основных файлов в архиве и стандарты, которым он сам придерживается, и типы содержимого этих файлов.
Все, что находится вне папки xl/
, на самом деле просто метаданные.Но обратите внимание, что docProps/core.xml
содержит информацию об авторе, модификации и метке времени - которую вы можете заменить в php при воссоздании этого файла.Также все, что указано, docProps/core.xml
может быть переименовано по вашему вкусу, [Content_Types].xml
не может.
Хорошо, теперь вы понимаете это, вы начнете наблюдать идентификаторы, выброшенные по всему месту.Они любят использовать это в формате файла, все относится ко всему остальному по индексу в определенном списке свойств xml или подобном.Они также обычно описывают количество элементов в таких списках.
В xl/
вы увидите themes.xml, styles.xml, workbook.xml, sharedStrings.xml, _rels/, worksheets/
.
Стили будут наполнены множеством ненужных стилей, которыеExcel строит по умолчанию, если вы его использовали.Но вы должны увидеть, как эти стили работают так, что вы можете настраивать свои собственные.
Темы для меня довольно бессмысленны, поэтому я удаляю их и идентификаторы, на которые они ссылаются повсюду.
Далее выВы увидите рабочую книгу, это файл, содержащий информацию о листах, которые находятся внутри документа электронной таблицы, поскольку у вас может быть больше 1, очевидно.Он также содержит некоторые метаданные листа, такие как его размер и т. Д.
Теперь идет первый большой хуа, с которым вы столкнетесь.sharedStrings.xml
- странный файл, в котором хранится вся информация, которая будет вставлена в ячейки в статической электронной таблице.Они проиндексированы, но механизм чтения документа выясняет, каковы их индексы.Все, что повторяется, может быть возвращено к его старому индексу в самом листе (внутри папки рабочих таблиц), чтобы сэкономить на размере файла в больших документах с повторяющимися значениями.Не атрибуты count
и uniquecount
в элементе sst
и то, что они, очевидно, означают.
Это этап в php, когда вы заполняете массив данных, содержащих то, что вы хотите на своем листе, исоздайте дамп в список в формате XML, такой как этот файл.Также обратите внимание, что эти файлы не нужно застревать без символов новой строки или перевода строки, так как с или без это все еще допустимый xml, и они будут работать в читателях независимо от того.
Проверьте папку _rels, это снова очевидно.
Наконец, сам лист.Числа в полях здесь относятся к индексированным местоположениям строк в sharedStrings.xml
.Атрибут s - это стиль, t - тип данных в поле.R - это местоположение ячейки, хотя зачем мне это нужно, я не могу понять, когда это действительно легко понять.
Создание этого файла в php также не должно быть слишком сложным.Просто используйте ваши индексы из массива данных, который вы использовали для создания вашего sharedStrings.xml
файла.
Да, лист содержит информацию о ширине столбца, которую вы можете вычислить на основе используемого вами шрифта, и автоматически измените их размер в phpтоже, если нужно.
И наконец, упаковка всего этого в php.
Мой код находится в классе, который принимает данные и определенные сохраненные файлы, которые я создал с помощью Excel, чтобы упростить его.
$this->folder_structure_simple = Array(
"_rels/.rels" => "_rels__rels",
"docProps/app.xml" => "docProps_app_xml",
"docProps/core.xml" => "docProps_core_xml",
"xl/_rels/workbook.xml.rels",
"xl/theme/theme1.xml",
"xl/worksheets/sheet1.xml",
"xl/sharedStrings.xml",
"xl/styles.xml",
"xl/workbook.xml",
"[Content_Types].xml" => "Content_Types_xml"
);
$zip = new ZipArchive;
$res = $zip->open($this->file_name, ZipArchive::CREATE);
if($res === TRUE){
foreach($this->folder_structure_simple as $file => $function){
$zip->addFromString($file, $this->$funtion);
}
$zip->close();
echo 'ok';
}else{
return FALSE;
}
И функции выдают необходимые данные.Очень быстрый, не очень гибкий.