phpexcelstringstrlen

My Content-Length header is wrong? What happened?


I am trying to find out the exact length of a string using strlen() in php 5.2. The string ($data) contains '\t' and '\n'.

echo strlen($data);

Code:

  // fetch table header
  $header = '';
  while ($fieldData = $result->fetch_field()) {
    $header .= $fieldData->name . "\t";
  }
    
  // fetch data each row, store on tabular row data
  while ($row = $result->fetch_assoc()) {
    $line = '';
    foreach($row as $value){
      if(!isset($value) || $value == ""){
        $value = "\t";
      }else{
        // important to escape any quotes to preserve them in the data.
        $value = str_replace('"', '""', $value);
        // needed to encapsulate data in quotes because some data might be multi line.
        // the good news is that numbers remain numbers in Excel even though quoted.
        $value = '"' . $value . '"' . "\t";
      }
    
      $line .= $value;
    }
    $data .= trim($line)."\n";
  }
    
  // this line is needed because returns embedded in the data have "\r"
  // and this looks like a "box character" in Excel
  $data = str_replace("\r", "", $data);
    
  // Nice to let someone know that the search came up empty.
  // Otherwise only the column name headers will be output to Excel.
  if ($data == "") {
    $data = "\nno matching records found\n";
  }
      
  // create table header showing to download a xls (excel) file
  header("Content-type: application/octet-stream");
  header("Content-Disposition: attachment; filename=$export_filename");
  header("Cache-Control: public");
  header("Content-length: " . strlen($data); // tells file size
  header("Pragma: no-cache");
  header("Expires: 0");

  // output data
  echo $header."\n".$data;

This does not return the exact length (its less than the actual length). Please advice.


Solution

  • You are telling the user agent to expect strlen($data) and then actually sending $header."\n".$data! Try something like this at the end of your code...

      $output=$header."\n".$data;
    
      // create table header showing to download a xls (excel) file
      header("Content-type: application/octet-stream");
      header("Content-Disposition: attachment; filename=$export_filename");
      header("Cache-Control: public");
      header("Content-length: " . strlen($output); // tells file size
      header("Pragma: no-cache");
      header("Expires: 0");
    
      // output data
      echo $output;