Генерация XLSX-таблицы средствами PHP. Проблема с архивацией
В данный момент активно работаю над генерацией XLSX-файлов средствами PHP. С XML-составляющей, вроде, более или менее разобрался, дело осталось за малым, собрать все в zip-архив. Но тут я столкнулся с проблемой следующего плана. Если я делаю архив при помощи PHP, т.е. так...
class myzip {
public static function zip($source, $destination) {
if (!extension_loaded('zip') || !file_exists($source)) {
return false;
}
$zip = new ZipArchive();
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
return false;
}
$source = str_replace('\\', DIRECTORY_SEPARATOR, realpath($source));
$source = str_replace('/', DIRECTORY_SEPARATOR, $source);
if (is_dir($source) === true) {
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file) {
$file = str_replace('\\', DIRECTORY_SEPARATOR, $file);
$file = str_replace('/', DIRECTORY_SEPARATOR, $file);
if ($file == '.' || $file == '..' || empty($file) || $file == DIRECTORY_SEPARATOR) {
continue;
}
// Ignore "." and ".." folders
if (in_array(substr($file, strrpos($file, DIRECTORY_SEPARATOR) + 1), array('.', '..'))) {
continue;
}
$file = realpath($file);
$file = str_replace('\\', DIRECTORY_SEPARATOR, $file);
$file = str_replace('/', DIRECTORY_SEPARATOR, $file);
if (is_dir($file) === true) {
$d = str_replace($source . DIRECTORY_SEPARATOR, '', $file);
if (empty($d)) {
continue;
}
$zip->addEmptyDir($d);
} elseif (is_file($file) === true) {
$zip->addFromString(str_replace($source . DIRECTORY_SEPARATOR, '', $file),
file_get_contents($file));
} else {
// do nothing
}
}
} elseif (is_file($source) === true) {
$zip->addFromString(basename($source), file_get_contents($source));
}
return $zip->close();
}
}
$obj = new myzip;
$obj->zip('folder-to-compress', 'compressed.xlsx');
...то результат не открывается в OpenOffice (неправильный формат), а вот, например, с мобильной версией MS Office на смартфоне (Android) таких проблем нет. Кстати, если я создаю архив вручную, тем же WinRAR, то все без проблем открывается и там и там... Чем это можно объяснить, может кто сталкивался?
Читал про такие библиотеки, как PhpSpreadsheet и PHPExcel, но хочется самому во всем разобраться...
Ответы (1 шт):
Нашел что-то вроде "полурешения". Если я создаю архив напрямую пофайлово, без переборки содержимого архивируемой папки, т.е. так...
$zip = new ZipArchive;
if ($zip->open('test.xlsx', ZipArchive::CREATE) === TRUE) {
$zip->addFile('xlsx/_rels/.rels', '_rels/.rels');
$zip->addFile('xlsx/docProps/app.xml', 'docProps/app.xml');
$zip->addFile('xlsx/docProps/core.xml', 'docProps/core.xml');
$zip->addFile('xlsx/xl/_rels/workbook.xml.rels', 'xl/_rels/workbook.xml.rels');
$zip->addFile('xlsx/xl/worksheets/sheet1.xml', 'xl/worksheets/sheet1.xml');
$zip->addFile('xlsx/xl/sharedStrings.xml', 'xl/sharedStrings.xml');
$zip->addFile('xlsx/xl/styles.xml', 'xl/styles.xml');
$zip->addFile('xlsx/xl/workbook.xml', 'xl/workbook.xml');
$zip->addFile('xlsx/[Content_Types].xml', '[Content_Types].xml');
$zip->close();
echo 'OK';
} else {
echo 'Error!';
}
...то OpenOffice Calc все прекрасно открывает и тем самым создает новые вопросы. Почему так? Может у кого-то есть предположения?