Как создать xlsx файл без использования любой библиотеки excel PHP
это прямо сейчас я использую.
$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 "$headern$data";
exit;
$header
переменная содержит строку заголовка excel для создания и выглядит следующим образом
$header= "Business_NametBusiness_TypetType";
разделены t
и $data
содержит строки, которые будут созданы под Столбцами заголовка. Они также разделены t
и заканчивается n
.
с текущим файлом установки загружается, но он не открывается с ms excel и показывает это сообщение.
Excel не удается открыть файл "имя файла " потому что формат файла или файл расширение недопустимо. Убедитесь, что формат файла не поврежден и что расширение файла соответствует формат файла.
какой заголовок следует отправить на сервер? или как сгенерировать этот файл?
3 ответов
то, что у вас есть, на самом деле файл CSV. В зависимости от вашей ОС, вашего браузера и Вашей версии Excel, браузер по-разному позволит вам или не позволит вам открыть расширения CSV, XLS XLSX с программным обеспечением Excel.
Если вы хотите, чтобы ваши данные были открыты с помощью Excel, то вы можете объединить данные с шаблоном Excel с помощью OpenTBS. Используйте версию 1.6.0 (или выше), которая в настоящее время находится в Release Candidate, потому что она приносит основные возможности для Excel файлы.
в вашем названии есть "нет библиотеки excel PHP". Я не знаю, почему у вас есть эта спецификация, но OpenTBS-это не совсем библиотека Excel. Это PHP-инструмент для объединения документов OpenOffice и Ms Office с помощью шаблонов.
Я достигаю этого быстрым, своего рода дешевым способом - потому что он длинный и запыхавшийся, я просто объясню это в концепции, а не в коде.
XLSX придерживается ISO 29500, который является общедоступным, если вы хотите тщательно манипулировать документом в php. В противном случае, поймите, что файлы xlsx являются архивами zipped из кучи xml-файлов.
Сделайте шаблон, который вы хотите, скажем, он имеет чередующиеся строки со стилями разных типов, что делает это в excel или open 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 также не должно быть слишком сложным. Просто используйте индексы из массива данных, который вы использовали для создания .
Oh также лист имеет информацию о ширине столбца в нем, который вы можете выяснить на основе шрифта, который вы использовали, и автоматически размер их в php тоже, если нужно.
наконец, это упаковка всего этого в php.
мой код находится в классе, который получает данные и определенные сохраненные файлы I создан с 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-обернутый blob XML. Измените тип MIME на text / csv.