Ho provato a verificare tutte le possibili soluzioni simili sia qui sia nella documentazione/forum ufficiali PHPExcel, ma non ho trovato alcuna soluzione al mio problema.PHPExcel - Clone sheet e mantiene il suo stile originale
Il problema
Sto cercando di clone (o copiare, essere onesti) un foglio per analizzare in un altro file creato attraverso phpexcel dal mantenendo lo stile del clonato scheda.
La messa a punto è:
sheet.xls < --- File per aprire & COPIA
oggetto PHPExcel < - File che viene creato X volte in un ciclo for, in cui ho bisogno di append Y Fogli in base a una serie di array.
Ciò che funziona
La clonazione & opere allegate splendidamente, richiede tempo a causa di alcuni strani avvisi relativi a un file phpexcel:
Avviso: undefined offset: 1 in \ serverpath \ PHPExcel \ Classes \ PHPExcel.php on line 729
Avviso: Offset non definito: 2 in \ serverpath \ PHPExcel \ Classes \ PHPExcel.php on line 729
Avviso: undefined offset: 3 in \ serverpath \ PHPExcel \ Classes \ PHPExcel.php on line 729
Avviso: undefined Offset: 4 in \ serverpath \ PHPExcel \ Classes \ PHPExcel.php on line 729
EDIT ::
linea 729 si riferisce a questo:
foreach ($sheet->getCellCollection(false) as $cellID) {
$cell = $sheet->getCell($cellID);
++$countReferencesCellXf[$cell->getXfIndex()]; // line 729
}
che è sugli stili, per quanto posso dire. < - Ci sono migliaia di questi, nessuna idea da dove provengano, i file vengono generati correttamente, semplicemente perdono il loro formato come detto sopra.
cosa non funziona
I file generati perde il formato originale, ma mantiene la formula, quindi ogni singolo bordo (e qualsiasi stile) del "modello" originale (sheet.xls) è perduto.
La parte rilevante del codice
Sto solo la pubblicazione del codice di veramente rilevante qui, soprattutto perché è circa un migliaio di righe di codice.
file che verrà successivamente salvati creazione (accade in foreach genitore):
$file = new PHPExcel();
Cloning (avviene all'interno di un foreach bambino dopo la creazione sopra):
$sd = $objReader->load("sheet.xls");
$sc = $sd ->getActiveSheet()->copy();
$clonedSheet = clone $sc;
Aggiunta (accade N volte all'interno di un bambino foreach della clonazione sopra):
$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
Risparmio (fuori del foreach, avviene nello stesso foreach in cui viene creato l'oggetto PHPExcel:
$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5');
$objWriter->save($filename);
Restrizioni
ho assolutamente nessuna restrizione su che tipo di formato excel che dovrei uso, sto usando il 2003 perché ho alcune macchine che funzionano solo con Excel 2003, ma presto passeranno all'ufficio 2010, quindi letteralmente qualsiasi lettore e scrittore va bene, sto usando il 2003 perché l'ho sempre usato e non ha avuto problemi finora.
Sono costretto, però, a clonare il foglio XLS all'interno di un altro file, l'unico trucco possibile che posso fare è clonare il foglio all'interno dello stesso file e salvarlo in seguito mantenendo quello originale, ma se ce n'è un altro possibilità di "esportare" lo stile lo apprezzerei molto.
quello che ho già controllato:
PHPExcel clone .xlsm with macros
http://www.mindfiresolutions.com/Cloning-a-XLS-worksheet-in-PHP--Mindfire-Solutions-933.php
PHPExcel 1.8.0 - Creating many sheets by cloning a template sheet gets slower with each clone
Workaround for copying style with PHPExcel
EDIT: :
Ho anche provato a:
- Aprire il file e ottenere il foglio invece di clonare l'originale - il problema persiste.
- Provato a utilizzare Excel2007 sia per la lettura che per la scrittura: il problema persiste.
- Provato NON usare -> copia() - Il problema persiste.
- AGGIORNATO phpexcel a 1,8, ora l'avviso sopra appare sulla riga 1079, ma si riferisce allo stesso codice esatto - Il problema persiste.