Как создать файл xlsx без использования Excel библиотеки PHP - PullRequest
8 голосов
/ 19 мая 2011

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

$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, которая будет сгенерирована и выглядит так1009 *, разделенные \t

и $data содержит строки, которые будут сгенерированы под столбцами заголовка.Они также разделены \t, а строка завершается \n.

При загрузке текущего установочного файла, но он не открывается с помощью MS Excel и показывает это сообщение.

Excel не может открыть файл «имя файла», так как формат файла или расширение файла недопустимы.Убедитесь, что формат файла не был поврежден и что расширение файла соответствует формату файла.

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

Ответы [ 3 ]

15 голосов
/ 16 сентября 2013

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

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;
}

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

3 голосов
/ 27 мая 2011

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

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

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

3 голосов
/ 19 мая 2011

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

...