Gå til innhold
Presidentvalget i USA 2024 ×

PHPExcel, samme kode lager korrupte eller korrekte filer, avhengig av hvilken fil koden ligger i


Anbefalte innlegg

(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 av Crowly
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...