Как создать 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.