PHPExcel – клон-лист и сохранить его оригинальный стиль

Я попытался проверить все возможные подобные решения как здесь, так и в официальной документации / форумах PHPExcel, но я не нашел решения для моей проблемы.

Проблема

Я пытаюсь клонировать (или копировать, будучи честным) лист для его анализа в другой файл, созданный с помощью phpexcel, сохраняя стиль клонированного листа .

Настройка:

sheet.xls <— Файл для OPEN & COPY

PHPExcel object <- Файл, который создается X раз в цикле for, где мне нужно добавить Y Sheets в соответствии с набором массивов.

Что работает

Процесс клонирования и добавления прекрасно работает, требуется время из-за некоторых странных уведомлений, связанных с файлом phpexcel:

Примечание. Неопределенное смещение: 1 в \ serverpath \ PHPExcel \ Classes \ PHPExcel.php в строке 729

Примечание: Неопределенное смещение: 2 в \ serverpath \ PHPExcel \ Classes \ PHPExcel.php в строке 729

Примечание. Неопределенное смещение: 3 в \ serverpath \ PHPExcel \ Classes \ PHPExcel.php в строке 729

Примечание. Неопределенное смещение: 4 в \ serverpath \ PHPExcel \ Classes \ PHPExcel.php в строке 729

РЕДАКТИРОВАТЬ ::

Строка 729 относится к этому:

foreach ($sheet->getCellCollection(false) as $cellID) { $cell = $sheet->getCell($cellID); ++$countReferencesCellXf[$cell->getXfIndex()]; // line 729 } 

Что касается стилей, насколько я могу судить. <- Есть тысячи из них, не знаю, откуда они идут, файлы генерируются правильно, они просто теряют свой формат, как сказано выше.

Что не работает

Сгенерированные файлы LOSES исходного формата, но сохраняют формулу, поэтому теряется каждая отдельная граница (и любой стиль) исходного «шаблона» (sheet.xls).

Соответствующая часть кода

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

Файл, который позже будет сохранен (происходит в родительском foreach):

 $file = new PHPExcel(); 

Клонирование (происходит внутри ребенка foreach после создания выше):

 $sd = $objReader->load("sheet.xls"); $sc = $sd ->getActiveSheet()->copy(); $clonedSheet = clone $sc; 

Добавление (происходит N раз внутри дочернего элемента для клонирования выше):

 $ficheName = "not relevant tbh and less than 31 characters"; $temporarySheet = clone $clonedSheet; $temporarySheet->setTitle($ficheName); $file->addSheet($temporarySheet,0); $file->setActiveSheetIndex($file->getIndex($temporarySheet)); unset($temporarySheet); // some actions are done here с $ficheName = "not relevant tbh and less than 31 characters"; $temporarySheet = clone $clonedSheet; $temporarySheet->setTitle($ficheName); $file->addSheet($temporarySheet,0); $file->setActiveSheetIndex($file->getIndex($temporarySheet)); unset($temporarySheet); // some actions are done here 

Сохранение (за пределами foreach, происходит в том же foreach, где создается объект PHPExcel:

 $objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5'); $objWriter->save($filename); 

ограничения

У меня нет абсолютно никаких ограничений относительно того, какой формат Excel я должен использовать, я использую 2003, потому что у меня есть некоторые машины, которые работают только с excel 2003, но скоро они будут обновляться до офиса 2010 года, так что буквально любой читатель и писатель в порядке, я использую 2003, потому что я всегда использовал его и до сих пор не испытывал никаких проблем.

Я вынужден, однако, клонировать лист XLS внутри другого файла, единственный возможный трюк, который я могу сделать, – это клонировать лист внутри того же файла и сохранять его позже, сохраняя исходный, но если есть еще один шанс «экспортировать» «стиль, который я бы очень признателен.

Что я уже проверил:

PHPExcel clone .xlsm с макросами

http://www.mindfiresolutions.com/Cloning-a-XLS-worksheet-in-PHP–Mindfire-Solutions-933.php

PHPExcel 1.8.0 – Создание множества листов путем клонирования листа шаблона становится медленнее с каждым клоном

Временное решение для копирования стиля с помощью PHPExcel

РЕДАКТИРОВАТЬ ::

Я также пытался:

  • Откройте файл и получите лист вместо клонирования оригинала. Проблема остается.
  • Пытался использовать Excel2007 как для чтения, так и для записи – проблема сохраняется.
  • Пробовал НЕ использовать -> copy () – Проблема сохраняется.
  • ОБНОВЛЕНО phpexcel до 1.8, теперь Уведомление выше появляется в строке 1079, но относится к одному и тому же фрагменту кода – Проблема сохраняется.

Хорошо, я выяснил возможное обходное решение.

Поскольку проблема, похоже, связана с:

  • clone
  • Рабочий лист PHPExcel ->copy()
  • Ссылка на рабочий лист PHPExcel

Я подумал об этом:

  • Вместо создания нового экземпляра объекта PHPExcel просто откройте исходный файл.
  • Приложите файл к другим экземплярам одного и того же файла, скопировав лист из одного файла.
  • Удалите LAST-лист, когда закончите.

Итак, вкратце, я изменил это:

 $file = new PHPExcel(); 

К этому:

 $file = $objReader->load("sheet.xlsx"); // decided to work with excel2007 

И это:

 $objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5'); $objWriter->save($filename); 

К этому:

 $sheetCount = $file->getSheetCount(); $file->removeSheetByIndex($sheetCount - 1); $objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel2007'); // same story, excel 2007 instead of 2003 $objWriter->save($filename); 

Теперь у меня нет никаких ошибок, и все работает так, как ожидалось, несмотря на то, что я уверен, что может быть другое более умное решение.

Если вы не измените формат sheet.xls, попробуйте A) использовать .xlsx B) переименовать * .xlsx в * .zip C) разархивировать sheet.zip и сохраненные вами файлы D) скопировать файл .xls / styles.xml от листа к сохраненным файлам E) переупаковать и переименовать * .zip в * .xlsx, и ваш формат вернется. Вы можете немного свести к минимуму проблему, не генерируя в цикле php, а скорее запустите php в цикле.