Generowanie w locie .xls

0

Witam,

Jak wykorzystać bibliotekę PHPExcel do generowania pliku .xls w locie bez zapisywania na serwerze. Posiadam taki kod:

include 'class/PHPExcel.php';

$objPHPExcel = new PHPExcel();

// Set document properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
                             ->setLastModifiedBy("Maarten Balliauw")
                             ->setTitle("PHPExcel Test Document")
                             ->setSubject("PHPExcel Test Document")
                             ->setDescription("Test document for PHPExcel, generated using PHP classes.")
                             ->setKeywords("office PHPExcel php")
                             ->setCategory("Test result file");

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Hello')
            ->setCellValue('B2', 'world!')
            ->setCellValue('C1', 'Hello')
            ->setCellValue('D2', 'world!');
// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');


// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
$objWriter->save("simple.xlsx");

Ale ten kod powoduje zapisanie pliku na serwerze a ja chce bez zapisu tylko wygenerowanie i otwarcie go od razu.

0

czyli rozumiem że to jest słaby pomysł lepiej zapisywać gdzieś to na serwerze ?

1

Nie, trochę źle rozumiesz ;) Oni radzą wygenerować normalną html'ową tabelkę i zwrócić ją użytkownikowi jako plik z rozszerzeniem *.xls, bo Excel i tak ją przetworzy. Jedyna wada to ostrzeżenie pokazywane w Excelu, co powoduje odczucie nieprofesjonalizmu wśród użytkowników.

1

tak wiem robiłem tak ze miałem tabelkę w html ale dawało ostrzeżenie. Wiec takie coś odpada chyba najlepiej będzie zapisać na serwer i potem go otworzyć normalnie. Ok dzięki za pomoc :)

1

Ostatecznie możesz zrobić plik kompatybilny z Excelem. Niech sobie użytkownik importuje plik CSV, bardzo łatwy format, nie potrzebujesz do niego żadnej specjalnej klasy :)

Szukałem trochę rozwiązania dla PHP, którego kiedyś użyłem w Pythonie do generowania plików zip w pamięci:

	zipstream=StringIO()
	file_zip = zipfile.ZipFile(zipstream,"w")
	file_zip.write("loader.exe","loader.exe")
	file_zip.write("app_data/game.zip","app_data/game.zip")
	file_zip.write("app_data/data.gz","app_data/data.gz")
	file_zip.close()
	
	zipstream.seek(0)
	
	plik=file("gra.zip","wb") # tutaj akurat dla testu zapisuje do pliku, ale zipstream można używać dowolnie ;)
	while True:
		buf=zipstream.read(2048)
		if buf=="": break
		plik.write(buf)
	plik.close()

Może Tobie to podsunie jakiś pomysł na słowa wyszukiwania dla PHP i Excela :) W sumie jakbyś miał dostęp do kodu obiektu tworzonego przez PHPExcel_IOFactory::createWriter, to byś mógł podmienić metodę save, żeby zamiast zapisu do pliku, zwracała stringa z plikiem. A może ten obiekt już ma taką metodę, poszukaj w dokumentacji.

1

Zrobiłem takie coś i działa bez błędu:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="myfile.xlsx"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');
0

A widzisz ;) Ładnie :) Dobrze znać takie "sztuczki" :)

1

Tak Tylko trzeba pamiętać że wersja 2007 czyli rozszerzenie .xlsx ma inny nagłówek niż ta wersja starsza i jak damy zły nagłówek to daje nam błąd przy otwieraniu ale się otworzy. A jak damy odpowiednie nagłówki to chodzi idealnie tak jak powinno. Wielkie dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1