2015-09-22 20 views
5

Próbowałem sprawdzić wszystkie możliwe podobne rozwiązania zarówno tutaj, jak i w oficjalnej dokumentacji/forach PHPExcel, ale nie znalazłem żadnego rozwiązania problemu.PHPExcel - arkusz klonu zachowuje swój oryginalny styl.

Problem

Próbuję klonu (lub kopią, będąc uczciwym) arkusz do analizowania go do innego pliku utworzonego przez phpexcel przez zachowując styl sklonowany arkusz.

Konfiguracja jest:

sheet.xls < --- plik, aby otworzyć & COPY

obiektu PHPExcel < - plik, który zostanie utworzony X razy w pętli for, gdzie muszę dołącz Arkusze Y zgodnie z zestawem tablic.

Co działa

klonowania & prace dołączanie pięknie, potrzeba czasu, z powodu jakichś dziwnych komunikatów związanych z pliku phpexcel:

Wskazówka: Undefined offset: 1 w \ ServerPath \ PHPExcel \ Classes \ PHPExcel.php na linii 729

Uwaga: Nie zdefiniowane przesunięcie: 2 w \ ścieżka_serwera \ PHPExcelcel \ Klasy \ PHPExcel.php na linii 729

Wskazówki: niezdefiniowanych offset: 3 w \ ServerPath \ PHPExcel \ Classes \ PHPExcel.php na linii 729

Wskazówki: niezdefiniowanych offset: 4 w \ ServerPath \ PHPExcel \ klas \ PHPExcel.php na linii 729

EDIT ::

Linia 729 odnosi się do tego:

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

który jest o stylach ile mogę powiedzieć. < - Jest ich tysiące, nie ma pojęcia, skąd pochodzą, pliki są generowane poprawnie, po prostu tracą swój format, jak wspomniano powyżej.

Co nie działa

generowanych plików traci oryginalny format, ale zachowuje wzór, stąd każdą granicę (i każdego stylu) oryginalnego „szablon” (sheet.xls) zgubiony.

Odpowiedni fragment kodu

Ja tylko zaksięgowania naprawdę odpowiedni kod tutaj, głównie dlatego, że jest to około tysiąc linii kodu.

plików, które następnie zostaną zapisane tworzenie (dzieje się w macierzystej foreach):

$file  = new PHPExcel(); 

klonowania (dzieje się wewnątrz foreach dzieci po utworzeniu powyżej):

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

Dołączanie (zdarza się N razy wewnątrz dziecięcego foreach klonowania powyżej):

$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 

Oszczędzanie (poza z foreach, dzieje się w tym samym foreach gdzie obiekt PHPExcel zostanie utworzona:

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

Ograniczenia

mam absolutnie żadnych ograniczeń o jakie formacie excel Mam używam, używam 2003, ponieważ mam kilka maszyn, które działają tylko z programem Excel 2003, ale wkrótce zostaną uaktualnione do pakietu Office 2010, więc dosłownie każdy czytnik i scenarzysta jest w porządku, używam 2003, ponieważ zawsze go używałem i jak dotąd nie miał problemu.

Jestem jednak zmuszony do sklonowania arkusza XLS w innym pliku, jedyną możliwą sztuczką, jaką mogę zrobić, jest sklonowanie arkusza w tym samym pliku i zapisanie go później, zachowując oryginał, ale jeśli jest jakikolwiek inny szansa na "eksport" stylu, który naprawdę bym to docenił.

co już sprawdzone:

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: :

Ja również próbował:

  • otworzyć plik i uzyskać arkusz zamiast klonowanie oryginalny - problem nie ustąpi.
  • Próbowałem używać Excel2007 zarówno do czytania, jak i pisania - Problem występuje.
  • Próbowano NIE używać -> copy() - problem nie zniknął.
  • ZAKTUALIZOWANY phpexcel do 1.8, teraz powyższe Wskazanie pojawia się na linii 1079, ale odnosi się do tego samego fragmentu kodu - Problem nie ustępuje.

Odpowiedz

6

Okej, wymyśliłem możliwe obejście tego problemu.

Ponieważ problem wydaje się być z:

  • clone
  • PHPExcel Arkusz ->copy() prototypu
  • Odwoływanie PHPExcel Arkusz

Myślałam o tym, że:

  • Zamiast tworzyć nową instancję obiektu PHPExcel, po prostu OPEN oryginalnego pliku.
  • Dołącz plik do innych wystąpień tego samego pliku, kopiując arkusz z tego samego pliku.
  • Po zakończeniu usuń OSTATNI arkusz.

Tak, w skrócie, zmieniłem to:

$file  = new PHPExcel(); 

do tego:

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

I tak:

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

do tego:

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

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

Teraz nie mam żadnego błędu i wszystko działa zgodnie z oczekiwaniami, mimo że jestem pewien, że może istnieć inne mądrzejsze rozwiązanie.

1

Jeśli nie zmienić format sheet.xls następnie spróbuj a) stosowanie .xlsx B) przemianować * .xlsx do * .zip C) Rozpakuj sheet.zip, oraz pliki zapisywane haved D) skopiuj plik .xls/styles.xml z arkusza do zapisanych plików E) przepakuj i zmień nazwę *. Zip na * .xlsx , a Twój format powrócił. Możesz trochę zminimalizować problem, nie generując pętli w php, lecz uruchamiając php w pętli.