Autor Zpráva
Tomášeek
Profil *
Ahoj,

snažím se v PHP z databázových dat vytvořit XLSX soubor pro Excel 2010, ale pokaždé skončím na tom, že se mi tento soubor nechce načíst. Na MS Office 2007/Office for Mac 2011 se mi soubor po odkliknutí, zda jej chci otevřít, načte. Na Win/Office 2010 nikoliv.

Zkoušel jsem jak pear.php.net/manual/en/package.fileformats.spreadsheet-excel-writer.intro.php, tak github.com/mk-j/PHP_XLSXWriter (a ještě jednu).

U obou jsem postupoval dle manuálu, u druhého jmenovaného odkazu mi nefunguje ani example (diskusi pod článkem jsem četl, ale bez výsledku).

Pokud u xlsxwriter.class.php uložím soubor se vzorovým kódem jako XLS, dostanu hlášku: Soubor, který chcete otevřít ..., je v jiném formátu, než určuje přípona souboru. Před otevřením souboru ověřte, zda není poškozen a zda pochází z důvěryhodného zdroje. Chcete soubor nyní otevřít? - ANO x NE x Nápověda. Na Macu/Win 2007 se soubor načte, na Office 2010 pro Win skončím s prázdnou tabulkou (nenačte se mi ani prázdný list, mám Excel bez otevřeného listu).

U XLSX hlásí Office 2010 na Win následující: Aplikace Excel nemůže otevřít soubor ..., protože formát nebo přípona nejsou platné. Ověřte, zda nedošlo k poškození souboru a zda přípona souboru odpovídá formátu souboru. Toto je pouze alert, s možností potvrdit toto znění pomocí "OK", výsledek stejný jako výše.


Kód, který mám, vzatý z example.php
require_once(__DIR__ . "/xlsxwriter.class.php");
$filename = "example.xls";
header('Content-disposition: attachment; filename="'.$filename.'"');
header("Content-Type: application/vnd.ms-excel"); // XLSX jsem použil "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
//header('Content-Transfer-Encoding: binary'); // toto bylo odkomentované, jen můj pokus.
header('Cache-Control: must-revalidate');
//header('Pragma: public'); // toto bylo odkomentované, jen můj pokus.

$data = array(
    array('year','month','amount'),
    array('2003','1','220'),
    array('2003','2','153.5'),
);

$writer = new XLSXWriter();
$writer->writeSheet($data);
$writer->writeToFile('example.xls');
die();

Uvádím vše potřebné, pokud s touto knihovnou máte někdo zkušenosti. Pokud ne, jakou používáte, aby bylo možno vytvořit s ní XLSX, které půjde bez problému otevřít na Win 7/Office 2010? Pokud se podělíte i o kód, kterým XLSX tvoříte, moc mi to pomůže. Už nevím, co bych vyzkoušel.


Děkuji za pomoc.
Alphard
Profil
V jednom projektu používám www.codeplex.com/PHPExcel a spokojenost. Bohužel mám jen Office 2013/2015, takže na starším vyzkoušet nemohu. Když sem dáš nějaký kontakt, pošlu ti soubor, který tim generujeme (je určen našim zákazníkům, není to tajné, ale úplně veřejně to sem dávat nechci).
Enko
Profil
Mě funguje skvěle knihovna PHPExcel, v tom balíku máš i konkrétní živé ukázky. Určitě na to mrkni.
Pokud to do zítra nebude vyřešené, dám sem živou ukázku vytvoření Excelu tabulky z MySQL. A funguje skvěle i pro Excel 2003, 2007, 2010, 2013, 2016. Teď nejsem na kompu :)
Tomášeek
Profil *
Alphard:
Na knihovnu PHPExcel jsem také tuším koukal, ale jestli můžu poprosit o zaslání vygenerovaného XLSX (+ zdroje), tak prosím na mail tomas.koutny87@gmail.com. Připoj i číslo účtu, pokud mi bude fungovat, rád se odměním (včera jsem s tím strávil několik dlouhých hodin a výsledku jsem se nedobral - bez další pomoci bych nad tím dnes a v budoucnu mohl trávit další dlouhé hodiny).

Enko:
To uvádíš tutéž knihovnu, co Alphard, že? Pokud někde máš ukázku připravenou, klidně ji pošli na mail uvedený výše, rovněž připoj i číslo účtu, odměním se rád oběma. Pokud ukázku připravenou nemáš, vyzkouším nejprve tu již hotovou od Alpharda, a pokud by z nějakého důvodu nefungovala, poprosím o pomoc tebe, dal bych sem vědět.

Děkuji oběma za snahu, moc mi pomůžete! :-)
Tomášeek
Profil *
Enko:
Tak po mailové pomoci od Alpharda jsem se dobral řešení, děkuji i za tvou nabídku ohledně ukázky. Za mě mohu říci, že vyřešeno.

PS. teď koukám, žes mi akorát napsal na mail. Podívám se i na tvou ukázku, pro zajímavost, jestli je více přístupů. Ač v mailu Alphard uvedl, že může připravit nějakou ukázku (já ji vkládat nechci, abych na něco důležitého nezapomněl, od někoho zkušenějšího bude do budoucna přínosnější), od tebe tam toto vidím taky. Nějak se tedy o diskusní ukázku poperte, pokud to mohu nechat na vás.

Jste oba super a ještě jednou velké díky!
Enko
Profil
Tomášeek:
Vše jsem ti poslal do emailu včetně vygenerovaného xlsx souboru. Níže přikládám kód, který vygeneruje XLSX soubor do prohlížeče ke stažení. Skript jsem zjednodušil a zakomentoval v angličtině. Pokud chce někdo vysvětlení či úpravy, dejte vědět :-)
<?php
  if(PHP_SAPI == 'cli'){
      die('This export should only be run from a Web Browser');
  }

  //load config file with MySQL connection
  require_once("./config/config.php");
  //in config file must be disabled print any errors messages, for example like this
  /*
  ini_set("display_errors", 0);
  error_reporting(0);
  ini_set('display_startup_errors', FALSE);
  */

  // Include PHPExcel library
  require_once("./libs/phpexcel/Classes/PHPExcel.php");

  // Create new PHPExcel object
  $objPHPExcel = new PHPExcel();

  // Set document properties
  $objPHPExcel->getProperties()->setCreator($username)
                           ->setLastModifiedBy($username)
                            ->setTitle("Nějaký titulek")
                            ->setSubject("Předmět")
                            ->setDescription("Popis")
                            ->setKeywords("klicova slova")
                            ->setCategory("kategorie");

  // Set column name in first row
  $objPHPExcel->setActiveSheetIndex(0)
              ->setCellValue('A1', 'Hodnota A1')
              ->setCellValue('A2', 'Hodnota A2')
              ->setCellValue('B1', 'Hodnota B1')
              ->setCellValue('B2', 'Hodnota B2')
              ->setCellValue('C2', 'Hodnota C2')

  //SQL Query
  $sql_query = "SELECT sloupec1, sloupec2, sloupec3 FROM table";
  $sql_res = mysql_query($sql_query);

  $r = 3;//set first row for print results into Excel file
  while($row = mysql_fetch_assoc($sql_res)){
      $objPHPExcel->getActiveSheet()->setCellValue('A'.$r, $row["sloupec1"])
                                    ->setCellValue('B'.$r, $row["sloupec2"])
                                    ->setCellValue('C'.$r, $row["sloupec3"])
    $r++;
  }

  //Set column width
  $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
  $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
  $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);

  // Rename worksheet
  $objPHPExcel->getActiveSheet()->setTitle('List1');

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

  // Redirect output to a client’s web browser (Excel2007)
  header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  header('Content-Disposition: attachment;filename="export_hrportal_zmeny_'.date('YmdGis').'.xlsx"');
  header('Cache-Control: max-age=0');
  // If you're serving to IE 9, then the following may be needed
  header('Cache-Control: max-age=1');

  // If you're serving to IE over SSL, then the following may be needed
  header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
  header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
  header ('Pragma: public'); // HTTP/1.0

  $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
  $objWriter->save('php://output');
  exit;
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: