2015-09-22 12 views
5

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.

risposta

6

OK, ho trovato una possibile soluzione alternativa.

Perché il problema sembra essere con:

  • clone
  • PHPExcel Foglio ->copy() prototipo
  • Referencing PHPExcel Foglio

Ci ho pensato che:

  • Invece di creare una nuova istanza di oggetto PHPExcel, basta APRIRE il file originale.
  • Aggiunge il file con altre istanze dello stesso file, copiando il foglio ancora dallo stesso file.
  • Al termine, rimuovere il foglio LAST.

Quindi, in poche parole, ho cambiato questo:

$file  = new PHPExcel(); 

A tal:

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

E questo:

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

A tal:

$sheetCount = $file->getSheetCount(); 
$file->removeSheetByIndex($sheetCount - 1); 

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

Ora non ho alcun errore e tutto funziona come previsto, nonostante sia sicuro che potrebbe esserci un'altra soluzione più intelligente.

1

Se non si modifica il formato di sheet.xls quindi provare a A) utilizzare .xlsx B) rinominare * .xlsx a * .zip C) sheet.zip Unzip, ei file si haved salvati D) copiare il file .xls/styles.xml dal foglio nei file salvati E) reimballare e rinominare * .zip in * .xlsx e il formato è tornato. Puoi minimizzare il problema un po 'non generando un loop in php, ma esegui il php in un loop.

Problemi correlati