Это сейчас я использую.
$mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; header('Content-Description: File Transfer'); header('Content-Type: ' . $mimeType); header('Content-Disposition: attachment; filename='.basename($type.'.xlsx')); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); print "$header\n$data"; exit;
$header
содержит строку заголовка excel, которая должна быть сгенерирована, и выглядит так:
$header= "Business_Name\tBusiness_Type\tType";
разделенных \t
и $data
содержат строки, которые должны быть сгенерированы в столбцах заголовка. Они также разделяются символом \t
а строка заканчивается на \n
.
С текущим установочным файлом загружается, но он не открывается с ms excel и показывает это сообщение.
Excel не может открыть файл «имя файла», поскольку формат файла или расширение файла недействительны. Убедитесь, что формат файла не был поврежден и расширение файла соответствует формату файла.
Какой заголовок должен быть отправлен на сервер? или как я могу сгенерировать этот файл?
На самом деле у вас есть файл CSV. В зависимости от вашей ОС, вашего браузера и вашей версии Excel, браузер по-разному позволяет вам или не открывать расширения CSV, XLS XLSX с программным обеспечением Excel.
Если вы хотите, чтобы ваши данные открывались с помощью Excel, вы можете объединить данные с шаблоном Excel с помощью OpenTBS . Используйте версию 1.6.0 (или больше), которая в настоящее время находится в Release Candidate, потому что она предоставляет основные возможности для файлов Excel.
В вашем названии есть «нет excel library PHP». Я не знаю, почему у вас есть эта спецификация, но OpenTBS – это не совсем библиотека Excel. Это инструмент PHP для слияния документов OpenOffice и Ms Office с использованием шаблонов.
Я достигаю этого быстрым, каким-то образом дешевого пути, потому что он длинный и ветренный, я просто объясню это скорее концепцией, чем кодом.
XLSX придерживается стандарта ISO 29500, который является общедоступным, если вы хотите тщательно манипулировать документом на php. В противном случае, поймите, что xlsx-файлы – это архивы из архива из кучи xml-файлов.
Сделайте шаблон, который вы хотите, скажем, что он чередует строки со стилями разных типов, делая это в excel или в открытом XML-редакторе некоторого описания. Убедитесь, что вы поместили некоторые данные там, и убедитесь, что некоторые поля равны (только для целей обучения).
Затем сохраните файл как xlsx, переименуйте его .zip или откройте его в экстракторе архива и наблюдайте за содержимым.
Во-первых, обратите внимание на файл [Content_Types] .xml, который описывает расположение основных файлов в архиве и стандарты, к которым он сам придерживается, и типы содержимого этих файлов.
Все, что находится за пределами папки xl/
– это действительно метаданные. Но наблюдайте, как docProps/core.xml
содержит информацию об авторе, модификации и временной docProps/core.xml
, которую вы можете заменить в php, когда вы воссоздаете этот файл. Также все, на что указывает, например, docProps/core.xml
можно переименовать на ваши вкусы, [Content_Types].xml
не может.
Ладно, теперь вы понимаете это, вы начнете наблюдать за идами, брошенными вокруг места. Они любят использовать это в формате файла, все ссылается на все остальное своим индексом в конкретном списке свойств xml или аналогичном. Они также обычно описывают количество предметов в таких списках.
В xl/
вы увидите themes.xml, styles.xml, workbook.xml, sharedStrings.xml, _rels/, worksheets/
.
Стили будут накачаны множеством ненужных стилей, которые по умолчанию строятся по умолчанию, если вы его использовали. Но вы должны уметь видеть, как эти стили работают так, что вы можете настроить свои собственные.
Темы для меня довольно бессмысленны, поэтому я удаляю его и ссылающиеся на него идентификаторы.
Затем вы увидите рабочую книгу, это файл, содержащий информацию о листах, которые находятся внутри документа электронной таблицы, так как вы можете иметь более 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; }
И функции выдают требуемые данные. Очень быстрая, не очень гибкая.
У вас есть CSV, а не файл XLSX. XLSX представляет собой ZIP-обернутый блок XML. Измените свой тип MIME на текст / csv.