Het genereren van een Excel-document met meerdere werkbladen van PHP?

Ik wil het genereren van een MS Excel-bestand van PHP. Ik weet dat je je iets kunnen doen als deze:

header ( "Content-type: application/vnd.ms-excel" );
header ( "Content-Disposition: attachment; filename=foo_bar.xls" );

Maar het zal het genereren van een bestand met slechts één Vel. Wat ik wil is het genereren van een bestand met meerdere bladen. Hoe kan ik dat doen? Misschien is er een derde partij bibliotheek, maar ik heb niet gevonden te veel.

  • Slechts een kleine opmerking over de formulering van je vraag; je zegt dat je al het genereren van een bestand met slechts één blad, maar de code die je hierboven gepost is niet het genereren van alles zijn, alleen stelt het downloaden van een reeds bestaand bestand. Heeft u al een bestand met de naam foo_bar.xls? Of is er sprake van code ontbreekt dat genereert het bestand met slechts één Vel.
  • Ik was nog maar blijkt dat ik weet hoe het genereren van een XLS-bestand. Net voor het vermijden van antwoorden die suggereren dat doen wat ik al gedaan heb. Natuurlijk, de code genereert het bestand is voltooid, ik was gewoon het tonen van een deel van.
  • Gewoon om te verduidelijken, ik geloof wat OP bedoeld is dat hij kan streamen van een CSV-bestand, maar met die kop, en het zal worden afgevoerd door de meeste browsers als een XLS-bestand. (Ik heb dit eerder gedaan) Hij was niet op de hoogte van de PHPExcel-aanpak in de geaccepteerde antwoord.
InformationsquelleAutor Cristian | 2010-07-16



4 Replies
  1. 75

    Proberen te kijken naar PHPExcel. Dit is een eenvoudig voorbeeld maakt u een Excel-bestand met twee bladen:

    <?php
    require_once 'PHPExcel.php';
    require_once 'PHPExcel/IOFactory.php';
    
    //Create new PHPExcel object
    $objPHPExcel = new PHPExcel();
    
    //Create a first sheet, representing sales data
    $objPHPExcel->setActiveSheetIndex(0);
    $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Something');
    
    //Rename sheet
    $objPHPExcel->getActiveSheet()->setTitle('Name of Sheet 1');
    
    //Create a new worksheet, after the default sheet
    $objPHPExcel->createSheet();
    
    //Add some data to the second sheet, resembling some different data types
    $objPHPExcel->setActiveSheetIndex(1);
    $objPHPExcel->getActiveSheet()->setCellValue('A1', 'More data');
    
    //Rename 2nd sheet
    $objPHPExcel->getActiveSheet()->setTitle('Second sheet');
    
    //Redirect output to a client’s web browser (Excel5)
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="name_of_file.xls"');
    header('Cache-Control: max-age=0');
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
    • Bedankt voor het bewerken in een voorbeeld Cristian. De hoop u vindt de bibliotheek eenvoudig te gebruiken
    • Deze bibliotheek is gewoon geweldig… in feite ben ik willen doneren een bedrag van geld. Bedankt voor het delen!
    • Ik heb wel een gevestigd belang in te delen: ik ben één van de auteurs 🙂
    • OMG! Bedankt voor je werk… het is echt geweldig.
    • +1 Voor u. Dank u Mark Bakker. Ik op zoek was naar het zelfde ding.
    • Lieve @MarkBaker BEDANKT voor een geweldig stukje software. U regel.
    • Dankzij @MarkBaker voor het voorbeeld! Werkte als een charme! +1
    • voor uw antwoord, Als ik wil veranderen van de opslag van het pad van het bestand, en vervolgens wat ik moet veranderen. d.w.z. ik wil het bestand opslaan onder een bepaalde locatie in mijn schijf.
    • voor het opslaan op de server: het verwijderen van de lijnen instellen van kop-en vervang ‘php://output’ in het gesprek op te slaan() met het pad/bestandsnaam van uw keuze…. voor het vertellen van de browser waar het bestand moet worden opgeslagen als gedownload naar de gebruiker, het vergeet – browsers werken niet op die manier en je hebt geen controle over waar de gebruikers kiest voor het opslaan van een bestand op zijn eigen PC
    • Hallo, ik waardeer uw antwoord, maar in lijn $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Something'); het schrijven op de eerste kolom en eerste rij, ik heb dynamische rij-en collin en willen schrijven. het hangt af van de gegevens in de databank. Dus leg uit of laat het me weten documentatie van het.
    • In de lijn $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Something');, de waarde A1 is de Excel-cel adres (kolom A, rij 1), veranderen A1 te B5 te schrijven naar de kolom B rij 5, enz…. dit is echt hoe MS Excel werkt, niet complex rocket science
    • ja bedankt voor die werken. Ik ben van plan om een script te schrijven dat zal een database in een spreadsheet, met elk vel wordt een tabel en het blad zelf nabootsen van de CSV-export van de gegevens. Ik kan het op basis van deze informatie, maar vroeg me af of je codebase heeft een snellere methode om een 2d-array en zetten het op een blad. Bedankt! Dit is voor office medewerkers snel inzicht te krijgen in een indeling die ze begrijpen.
    • Moet echt een nieuwe vraag, maar het blad heeft een fromArray() methode die doet wat je vraagt…. echter, je bent beter werken een rij in een tijd van de db in plaats van grote arrays in het geheugen
    • bedankt en ik ga akkoord. Toen ik het script post ik een vraag.
    • Nieuwe projecten kunnen willen: github.com/PHPOffice/PhpSpreadsheet

  2. 3

    Als u betekenen als uw PHP script aan het maken van een Excel-bestand, schrijf een aantal dingen op een plaat, enz, dan biedt dat voor de client te downloaden, kun je gewoon gebruik maken van PHP de ingebouwde COM-extensie. Zie: http://us2.php.net/manual/en/class.com.php voor allerlei voorbeelden. Echter, moet u Excel (of een kloon zoals OpenOffice) is geïnstalleerd op de server. Als u niet, misschien Mark Baker ‘ s antwoord hierboven werkt in plaats van zonder.

    • Ik geloof niet dat Open Office ondersteunt COM, ik denk dat dat beperkt tot een reeks van MS-toepassingen, waarbij geen limiet voor deze optie om een Windows server. COM is vrij krachtig en zeer efficiënt, maar helaas niet goed gedocumenteerd
    • Baker: OpenOffice ondersteunt COM. Zie: wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/…
    • Bedankt voor de verwijzing, dat is handig om te weten… ik zal het moeten doen wat spelen met het
    • Np. Het nabootsen van COM op andere OS ‘ s is mogelijk (XPCOM, CORBA), maar het ziet er pijnlijk complex en onbekend als PHP zou zelfs werken met mensen. Ik ben er zeker van dat u kan ook nep zijn het gebruik van WIJN. OSX (macdevcenter.com/pub/a/mac/2004/04/16/com_osx.html?page=1) moet werken met het uit de doos.
    • Vergeten te vermelden: ik kan het niet vinden van het citaat op de PHP handleiding meer, maar het deed niet suggereren met behulp van COM op een server. Dit is een goed advies. Als clients toegang tot dezelfde Excel-bestand, beschadigingen kunnen optreden. Als iets oorzaken van een popup-prompt als “weet je zeker dat je dit wilt doen?”, de aanvraag zal hangen verwacht server klik op OK.
  3. 0
     <?php 
      require_once 'PHPExcel.php';
      require_once 'PHPExcel/IOFactory.php';
      //Update the multiple sheets in PHP excel
     $report_file = 'Report_' . date('Y-m-d') . '.xlsx';
     $report_file_exists  = 0;
     //If the file doesnot exist , create new otherwise append the data at last
     if (!file_exists($report_file)) {
          $objPHPExcel = new PHPExcel();
     } else {
          $report_file_exists = 1;
          $objPHPExcel = PHPExcel_IOFactory::load($report_file);
     }
    
     $columns = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
    
     //Sheet details
     $sheet_details = array(
                            //1st sheet details
                            0 => array('sheet_title' => 'Products', 
                                       'sheet_heading' => array('Article_Number','Name'),
                                       'sheet_data' => array('1234','Pen')
                                       ),
                            //2nd Sheet Details
                            1 => array('sheet_title' => 'Categories',
                                       'sheet_heading' => array('Category Id','Name'),
                                       'sheet_data' => array(123,'Accessories')
                                      )
                       );
    
     $sheet_count = 0;
     $row = 1;
     $column = 0;
     while ($sheet_count <= count($sheet_details)) {
          $objWorkSheet = '';
          if ($report_file_exists == 0) {
               if ($sheet_count > 0) {
                    $objWorkSheet = $objPHPExcel->createSheet($sheet_count);
               } else {
                    $objWorkSheet = $objPHPExcel->getActiveSheet();
               }
               $row = 1;
               $column = 0;
               foreach ($sheet_details[$sheet_count]['sheet_heading'] as $head) {
                    $objWorkSheet->setCellValue($columns[$column] . $row, $head);
                    $column++;
               }
          } else {
               $objPHPExcel->setActiveSheetIndex($sheet_count);
               $objWorkSheet = $objPHPExcel->getActiveSheet($sheet_count);
          }
    
          $row = $objWorkSheet->getHighestRow() + 1; //row count
          foreach ($sheet_details[$sheet_count]['sheet_data'] as $report_details) {
               $column = 0;
               foreach ($report_details as $data) {
                    $objWorkSheet->setCellValue($columns[$column] . $row, $data);
                    $column++;
               }
               $row++;
          }
    
          $objWorkSheet->setTitle($sheet_details[$sheet_count]['sheet_title']);
          $sheet_count++;
     }
    
     $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
    
     $objWriter->save($report_file);
     ?>
  4. 0

    Dit kunt u bereiken door DIT WORDT GEDAAN DOOR

     $objPHPExcel = new PHPExcel();
     $objPHPExcel->getProperties()->setCreator("creater");
     $objPHPExcel->getProperties()->setLastModifiedBy("Middle field");
     $objPHPExcel->getProperties()->setSubject("Subject");
     $objWorkSheet = $objPHPExcel->createSheet();
     $work_sheet_count=3//number of sheets you want to create
     $work_sheet=0;
     while($work_sheet<=$work_sheet_count){ 
         if($work_sheet==0){
             $objWorkSheet->setTitle("Worksheet$work_sheet");
             $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 1')->getStyle('A1')->getFont()->setBold(true);
             $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed
         }
         if($work_sheet==1){
             $objWorkSheet->setTitle("Worksheet$work_sheet");
             $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 2')->getStyle('A1')->getFont()->setBold(true);
             $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed
         }
         if($work_sheet==2){
             $objWorkSheet = $objPHPExcel->createSheet($work_sheet_count);
             $objWorkSheet->setTitle("Worksheet$work_sheet");
             $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 3')->getStyle('A1')->getFont()->setBold(true);
             $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed
         }
         $work_sheet++;
     }

    $filename='file-name'.'.xls'; //save our workbook as this file name
    header('Content-Type: application/vnd.ms-excel'); //mime type
    header('Content-Disposition: attachment;filename="'.$filename.'"'); //tell browser what's the file name
    header('Cache-Control: max-age=0'); //no cache

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *