Crowly Skrevet 13. mars 2012 Rapporter Del Skrevet 13. mars 2012 (endret) (tips til bedre emne tittel tas i mot med takk ) PHPExcel lager korrupte filer hvis jeg kaller det fra ett skript, men korrekte filer hvis den samme koden blir kjørt fra ett annet skript. I skrivut.php som ligger i rot katalogen, denne varianten lager en korrupt fil, se case 'excel' delen av switchen <?php session_start(); include_once 'libs/class_pdo.php'; include_once 'libs/class_bruker.php'; include_once 'libs/class_liste.php'; include_once 'libs/class_generelt.php'; include_once 'libs/class_skrivut.php'; include_once 'libs/fpdf/fpdf_ext.php'; include_once 'libs/PHPExcel/PHPExcel.php'; try { $db=new pdo_ext('libs/innstikk.ini'); $bruker=new bruker($db); $skrivut=new skrivut($db, $bruker); switch ($_GET['ark']) { default: case 'liste': break; case 'pallmerk': if (isset($_GET['id']) and filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT)) { $id=(int)$_GET['id']; $skrivut->lag_pallmerk($id); } break; case 'excel': $liste=new liste($bruker,$db); $skrivut->lag_excel($liste->behandle_liste_post()->sett_utskrift(true)->hent_liste()); // lager korrupt fil break; } } catch (Exception $e) { $gen=new generelt(); echo $gen->standard('innstikk/js/'); echo '<title>PTAA::Innstikk - Feil</title>'; echo '</head><body>'; echo $e->getMessage(); echo '</body></html>'; } ?> Hvis jeg endre det til slik, mellomlagrer i $_SESSION, og henter det frem igjen i excel.php så fungerer det. <?php // kun endringer case 'excel': $liste=new liste($bruker,$db); $_SESSION['tmp']=$liste->behandle_liste_post()->sett_utskrift(true)->hent_liste(); header('Location: excel.php'); break; ?> excel.php ser slik ut og ligger i samme katalog som skrivut.php, og lager korrekte filer. <?php session_start(); include_once 'libs/PHPExcel/PHPExcel.php'; include_once 'libs/class_generelt.php'; include_once 'libs/class_skrivut.php'; include_once 'libs/class_pdo.php'; include_once 'libs/class_bruker.php'; $data=$_SESSION['tmp']; $db=new pdo_ext('libs/innstikk.ini'); $bruker=new bruker($db); $skrivut=new skrivut($db, $bruker); $skrivut->lag_excel($data); ?> lag_excel() funksjonen er slik public function lag_excel($data=array()) { if (empty($data)) throw new exception('Kan ikke lage excel ark, ingen input data'); $dato=$data[0]->distdato; $siste_dato=end($data)->distdato; reset($data); $excel = new PHPExcel(); // Set properties $excel->getProperties()->setCreator("PTAA") ->setLastModifiedBy("PTAA") ->setTitle("PTAA Innstikk") ->setSubject("PTAA Innstikk") ->setDescription("PTAA Innstikk") ->setKeywords("PTAA Innstikk") ->setCategory("PTAA Innstikk"); // periode $excel->setActiveSheetIndex(0) ->setCellValue('A1','F.o.m.') ->setCellValue('B1',$dato) ->setCellValue('C1','T.o.m.') ->setCellValue('D1',$siste_dato); // heading $i=3; $excel->setActiveSheetIndex(0) ->setCellValue('A'.$i,'Dag') ->setCellValue('B'.$i,'Dato') ->setCellValue('C'.$i,'Navn') ->setCellValue('D'.$i,'Res.') ->setCellValue('E'.$i,'Format') ->setCellValue('F'.$i,'Vekt') ->setCellValue('G'.$i,'Avis') ->setCellValue('H'.$i,'Antall') ->setCellValue('I'.$i,'Sone') ->setCellValue('J'.$i,'Red.') ->setCellValue('K'.$i,'Paller') ->setCellValue('L'.$i,'Mottatt Antall') ->setCellValue('M'.$i,'Mottatt') ->setCellValue('N'.$i,'Selger') ->setCellValue('O'.$i,'Mrk.'); // data $i=4; foreach ($data as $d) { $excel->setActiveSheetIndex(0) ->setCellValue('A'.$i,$d->dag) ->setCellValue('B'.$i,$d->dato) ->setCellValue('C'.$i,$d->navn) ->setCellValue('D'.$i,($d->reservert==1 ? 'Ja' : 'Nei')) ->setCellValue('E'.$i,$d->sider.'s '.$d->fmt) ->setCellValue('F'.$i,$d->vekt.'g') ->setCellValue('G'.$i,$d->avis) ->setCellValue('H'.$i,$d->antall) ->setCellValue('I'.$i,$d->sone) ->setCellValue('J'.$i,($d->redaksjonelt==1 ? 'Ja' : 'Nei')) ->setCellValue('K'.$i,$d->paller) ->setCellValue('L'.$i,$d->mottant_antall) ->setCellValue('M'.$i,$d->mottatt_dato) ->setCellValue('N'.$i,$d->selger) ->setCellValue('O'.$i,$d->mrk); $i++; } // Rename sheet $excel->getActiveSheet()->setTitle('Innstikk'); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $excel->setActiveSheetIndex(0); // Redirect output to a client’s web browser header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="innstikk.xls"'); header('Cache-Control: max-age=0'); $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5'); $writer->save('php://output'); } Alle filer er lagret i UTF-8 uten BOM. Har testet å endre tegnsett i filene til ansi, og å bruke utf8_decode() og utf8_encode() på de forskjellige funksjonene som setter en verdi, bl.a. setCellValue, for å se om det gjorde noe utslag, noe det ikke gjorde. Sliter litt med å få has på denne nøtta, da det meste er helt likt klarer jeg ikke å se hva som kan være galt. Noen som har vært borti noe tilsvarende og har noen tips? Endret 13. mars 2012 av Crowly Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå