Как создать файл xlsx без использования какой-либо библиотеки Excel PHP

#php #xlsx

#php #xlsx

Вопрос:

Это прямо сейчас я использую.

 $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 не может открыть файл «имя файла», потому что формат файла или расширение файла недопустимы. Убедитесь, что формат файла не был поврежден и что расширение файла соответствует формату файла.

Какой заголовок должен быть отправлен на сервер? или как мне сгенерировать этот файл?

Ответ №1:

Я достигаю этого быстрым, своего рода дешевым способом — поскольку это долго и запутанно, я просто объясню это концепцией, а не кодом.

XLSX соответствует стандарту ISO 29500, который является общедоступным, если вы хотите тщательно обработать документ на php. В противном случае поймите, что файлы xlsx представляют собой сжатые архивы из множества XML-файлов.

Создайте шаблон, который вы хотите, скажем, в нем есть чередующиеся строки со стилями разных типов, создав это в Excel или в редакторе open xml с некоторым описанием. Убедитесь, что вы поместили туда некоторые данные, и убедитесь, что некоторые поля равны (просто для целей обучения).

Затем сохраните ваш файл как xlsx, переименуйте его в .zip или откройте его в программе извлечения архива и просмотрите содержимое.

Во-первых, обратите внимание на файл [Content_Types].xml, он описывает расположение основных файлов в архиве, стандарты, которым он соответствует, и типы содержимого этих файлов.

Все, что находится за пределами xl/ папки, на самом деле является просто метаданными. Но observe docProps/core.xml содержит информацию об авторе, модификации и временной метке, которую вы можете заменить в php при воссоздании этого файла. Также все, на что указано, docProps/core.xml можно переименовать по своему вкусу, [Content_Types].xml не могу.

Хорошо, теперь вы понимаете это, вы начнете наблюдать за идентификаторами, разбросанными повсюду. Они любят использовать это в формате файла, все ссылается на все остальное по своему индексу в определенном списке свойств xml или подобном. Они также обычно описывают количество элементов в таких списках.

В xl/ вы увидите themes.xml, styles.xml, workbook.xml, sharedStrings.xml, _rels/, worksheets/ .

Styles будет наполнен множеством ненужных стилей, которые Excel создает по умолчанию, если вы его использовали. Но вы должны быть в состоянии увидеть, как работают эти стили, чтобы вы могли настроить свои собственные.

Темы для меня довольно бессмысленны, поэтому я удаляю его и идентификаторы, на которые ссылаются, повсюду.

Далее вы увидите workbook, это файл, содержащий информацию о листах, которые находятся внутри документа электронной таблицы, поскольку очевидно, что у вас может быть больше 1. Он также содержит некоторые метаданные листа, такие как его размер и т.д.

Теперь наступает первая большая проблема, с которой вы столкнетесь. sharedStrings.xml это странный файл, в котором хранится вся информация, которая будет вставлена в ячейки статической электронной таблицы. Они проиндексированы, но движок, считывающий документ, определяет, каковы их индексы. Все, что повторяется, может быть возвращено к его старому индексу в самом листе (внутри папки worksheets), чтобы сэкономить на размере файла в больших документах с повторяющимися значениями. Не атрибуты count и uniquecount в sst элементе и что они, очевидно, означают.

Это этап в php, на котором вы заполняете массив данных, содержащий то, что вы хотите на вашем листе, и помещаете его в список в формате xml, такой, как отображается этот файл. Также обратите внимание, что эти файлы не нужно загромождать без перевода строк или символов перевода строки, поскольку с или без по-прежнему действует xml, и они будут работать в readers независимо.

Проверьте папку _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;
}
  

И функции выдают необходимые данные. Очень быстрый, не очень гибкий.

Комментарии:

1. Отличный ответ, это действительно отличное описание того, как создавать или настраивать ваши собственные файлы XLSX на PHP. Я не уверен, почему вы назвали это «скрягой» — хотя, это довольно аккуратно.

2. Причина, по которой я называю это так, заключается в том, что я в значительной степени избегал чтения чего-либо из ISO 29.5 k: P

3. Очень хорошее, приземленное описание, официальные документы слишком обширны, а также не предлагают практической реализации для PHP. Что касается структуры архива (XLSX-файла), это лучший обзор, который я нашел, он лаконичен и дополнен несколькими полезными скриншотами: officeopenxml.com/anatomyofOOXML-xlsx.php

4. Возможно, еще лучше, это сообщение в блоге на сайте Microsoft: blogs.msdn.microsoft.com/brian_jones/2006/11/02 /…

Ответ №2:

То, что у вас есть, на самом деле является файлом CSV. В зависимости от вашей операционной системы, вашего браузера и вашей версии Excel, тогда браузер по-разному позволит вам открывать расширения CSV, XLS XLSX с программным обеспечением Excel.

Если вы хотите, чтобы ваши данные были открыты в Excel, то вы можете объединить данные с шаблоном Excel, используя OpenTBS. Используйте версию 1.6.0 (или выше), которая в настоящее время находится в Release Candidate, поскольку она предоставляет основные возможности для файлов Excel.

В вашем заголовке нет библиотеки Excel PHP». Я не знаю, зачем вам эта спецификация, но OpenTBS — это не совсем библиотека Excel. Это PHP-инструмент для объединения документов OpenOffice и Ms Office с использованием шаблонов.

Комментарии:

1. ‘OpenTBS — это не совсем библиотека Excel’. Ну, из tinybutstrong.com индексная страница: ‘TinyButStrong — это библиотека , которая позволяет динамически создавать XML / HTML-страницы …’

Ответ №3:

Что у вас есть CSV, а не файл XLSX. XLSX — это XML-файл в ZIP-оболочке. Измените свой MIME-тип на text / csv.

Комментарии:

1. Не перенаправляйте меня на CSV . Этот формат работал с xls , но не работает с xlsx . Я не хочу CSV

2. Тогда зачем вы создаете CSV? : ) Формат XSLX невероятно сложен, но если вы хотите это сделать, вам, вероятно, следует погуглить спецификацию XLSX, которая доступна (хотя и не актуальна для реализации MS). Вы можете начать здесь: openxmldeveloper.org/articles/GuidedTourOfSpecPart1.aspx . ТЕМ не менее, это ваши похороны. Спецификация на несколько порядков сложнее, чем запись CSV (как та, которую вы описали выше). Не отвергайте меня за то, что я отвечаю на ваш нестандартный вопрос. : )