-->

Export .xlsx with PHPSpreadsheet reading a .php fi

2019-08-23 08:03发布

问题:

Is it possible to create an .xlsx spreadsheet using PHPSpreadsheet from a .php file that creates an HTML table? The .php file creates an HTML table from both POST and DB values. I'm able to successfully create an .xls file using just php header instructions. The closest I've gotten through PHPSpreadsheet is reading the .php file as HTML, which creates an .xlsx file but also generates php warnings in the browser about the filetype, and the .xlsx file contains all of the php code in addition to the generated HTML table (The static headers of the table are in the spreadsheet but not the dynamic php content of the table). I can't find anything in the PHPSpreadsheet documentation about reading from a .php file. I've tried using a text/html header at the beginning of the php file and that changes nothing about the content of the .xlsx file.

   <?php
    require_once("../urlparse.php");
    require_once("$passwordfile");
    require_once("dbfetchsiteoptions.php");
    $fullname = $_SESSION['fullname'];
    $userid = $_SESSION['userid'];
    $stmt = $PDO->prepare("SELECT * FROM siteoptions WHERE optionname='timesheetround'");
    $stmt->execute();
    $data = $stmt->fetch(PDO::FETCH_ASSOC);
    $optionname = $data['optionname'];
    $roundoptions = array($data['optionvalue1'], $data['optionvalue2'], $data['optionvalue3']);
    $valuecurrent = $data['optionvaluecurrent'];
    $stmt = $PDO->prepare("SELECT * FROM payperiod WHERE id='1'");
    $stmt->execute();
    $data = $stmt->fetch(PDO::FETCH_ASSOC);
    $payperiodstart = new DateTime($data['payperiodstart']);
    $payperiodinterval = new DateInterval($data['payperiodinterval']);
    while($payperiodstart <= $newdatetime) {
      $payperiodstartdate = $payperiodstart->format('m-d-Y');
      $payperiodstart->add($payperiodinterval);
      $payperiodstart->sub(new DateInterval('P01D'));
      $payperiodenddate = $payperiodstart->format('m-d-Y');
      $payperiodstart->add(new DateInterval('P01D'));
    }
    if(isset($payperiodstartdate))   echo '<table><tr><th>From</th><th>'.$payperiodstartdate.'<th>To</th><th>'.$payperiodenddate.'</th></tr>';
    $stmt = $PDO->prepare("SELECT * FROM timesheet WHERE userid='$userid' ORDER BY id ASC");
    $stmt->execute(); ?>

    <table><tr><th>Date</th><th>Time-In</th><th>Time-Out</th><th>Hours</th></tr>

    <?php
    while($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
      $date = new DateTime($data['date']);
      $date = $date->format('m-d-Y');
      if($date >= $payperiodstartdate AND $date <= $payperiodenddate) {
        $hours[] = $data['hours'];
        echo '<tr><td>'.$date.'</td><td>'.date("g:i a", strtotime($data['timein'])).'</td>';
        if($data['timeout'] == NULL) {
          echo '<td>Working...</td>';
        }else{
          echo '<td>'.date("g:i a", strtotime($data['timeout'])).'</td>';
        }
        echo '<td>'.$data['hours'].'</td></tr>';
      }
    } ?>

    </table>

    <?php
    if(empty($hours)){$hours = '00:00';}
    $counter = new times_counter($hours);
    class times_counter {
      private $hou = 0;
      private $min = 0;
      private $sec = 0;
      private $totaltime = '00:00';
      public function __construct($times){
        if(is_array($times)){
          $length = sizeof($times);
          for($x=0; $x <= $length; $x++){
            $split = explode(":", @$times[$x]);
            if(!empty($split[0])) {$this->hou += @$split[0];}
            $this->min += @$split[1];
          }
          $seconds = $this->sec % 60;
          $minutes = $this->sec / 60;
          $minutes = (integer)$minutes;
          $minutes += $this->min;
          $hours = $minutes / 60;
          $minutes = $minutes % 60;
          $hours = (integer)$hours;
          $hours += $this->hou;
          if($minutes < '10') {$minutes = sprintf("%02d", $minutes);}
          if($hours < '10') {$hours = sprintf("%02d", $hours);}
          if($hours >= 80) {$othours = $hours - 80; $hours = 80;}
          if(isset($othours)) {$this->totaltime = $hours.':00<br><h3>Overtime</h3>'.$othours.':'.$minutes;}else{$this->totaltime = $hours.":".$minutes;}
        }
      }
      public function get_total_time(){
          return $this->totaltime;
      }
    }
    ?>

    <table><tr><th></th><th></th><th></th><th>Total Hours</th></tr><tr><td></td><td></td>
<td></td><td><?php echo $counter->get_total_time(); ?></td></tr>

</table>

回答1:

You have 2 ways to do this :

  • continue to generate your xlsx from the HTML generated by your php script.

In this way, your PHP script generates (for instance) an export.html file on the disk, and then phpspreadsheet code reads this file (with "HTML Reader") and generates the xslx.

With PHPExcel (prior name of phpspreadsheet), we did like this :

$inputFileType = 'HTML';
$inputFileName = './myHtmlFile.html';
$outputFileType = 'Excel2007';
$outputFileName = './myExcelFile.xlsx';

$objPHPExcelReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objPHPExcelReader->load($inputFileName);

$objPHPExcelWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,$outputFileType);
$objPHPExcel = $objPHPExcelWriter->save($outputFileName);
  • instead of generating an HTML, you can generate a CSV for your PHP code, and then send it to phpspreadsheet, see the documentation here https://phpspreadsheet.readthedocs.io/en/develop/topics/reading-files/