2013-12-02 2 views
2

Когда я создать отчет Excel с помощью PHPExcel я получаю эту ошибку:PHPExcel файл может быть поврежден или небезопасным

"The file format and extension of 'test.xls' don't match. The file could be corrupted or unsafe. Unless you trust its source, don't open it. Do you want to open it anyway?"

Это мой настройки - PHP 5.4/PHPExcel 1.7.9/Windows 7

Когда я нажимаю «ОК», чтобы открыть файл небезопасного excel, он либо пуст, либо бред.

Код HTML: позволяет пользователю выбрать отчет из раскрывающегося списка, затем они выбирают кнопку, если они либо хотят просмотреть отчет, создать файл Excel или создать файл PDF. Но в этом случае я работаю над созданием файлов excel.

<!DOCTYPE html"> 
<html> 
    <head> 
    <meta charset=utf-8" /> 
     <title>Generate Reports</title> 

     <link rel="stylesheet" type="text/css" href="style.css" media="screen" /> 

     <!--Display the Criteria screen only if Title Org Codes Report (rpt3) is selected--> 
     <script type="text/javascript"> 
      function showForm() {  
       var selopt = document.getElementById("selReport").value; 

       if (selopt === "rpt3") { 
        document.getElementById("criteria").style.display = "block"; 
       } 

       else { 
        document.getElementById("criteria").style.display = "none"; 
       } 

      } 
     </script> 

    </head> 
    <body> 
    <div id="wrapper"> 

       <div id="content"> 

        <div id="reports" class="center"> 
         <h3> Generate Reports: </h3> 

         <!--Display the list of reports--> 
         <form id="frm1" name="frm1" method="post" action="Reports.php"> 
          <!-- Excel, PDF, View buttons --> 
          <input type="submit" value="Preview Report" id="view" name="view"> 
          <input type="submit" value="Export to Excel" id="excel" name="excel"> 
          <input type="submit" value="Publish as PDF" id="pdf" name="pdf"> 
          <br><br><br> 

          Select a Report: 
          <select id="selReport" name="selReport" onclick="showForm();"> 
           <option></option> 
           <option value="rpt1">Units/Ranges Summary</option> 
           <option value="rpt2">Divisions Table</option> 
           <option value="rpt3">Title Codes</option> 
          </select> 


          <!--Creates the criteria drop down menu-->   
          <div id="criteria" style="display:none"> 
           <br><br><h3>Selection Criteria for Reports:</h3> 
            Title File Status: 
            <select name="selCriteria" id="selCriteria" onchange="showForm();"> 
             <option></option> 
             <option value="active">Active</option> 
             <option value="inactive">Inactive</option> 
             <option value="all">All</option> 
            </select>  
          </div> <!--end criteria --> 

         </form> <!-- end frm1 --> 

        </div> <!-- end #reports --> 

       </div> <!-- end #content --> 

    </div> <!-- end #wrapper --> 
</body> 
</html> 

Вот PHP файл: где выполняется код PHPExcel. Я построил if else заявления, чтобы указать, какой отчет пользователь выбрал и запустить только этот отчет.

<?php 
    //Get the user selection and put into variables 
    $varRpt = $_POST['selReport']; 
    $varCrit = $_POST['selCriteria']; 

    // require the PHPExcel classes 
    require 'PHPExcel/Classes/PHPExcel.php'; 

    // PHPExcel_Writer_Excel2007 
    require 'PHPExcel/Classes/PHPExcel/Writer/Excel2007.php'; 

    //------------------------------- 
    // Connect to the MySQL database 
    //------------------------------- 
    $dbhost = "localhost"; 
    $dbuser = "root"; 
    $dbpass = "*******"; 
    $dbname = "test"; 

    mysql_connect($dbhost,$dbuser,$dbpass)or die ("Could not connect to mysql because ".mysql_error()); 

    mysql_select_db($dbname)or die("Unable to select database" .mysql_error()); 

    //------------------------------------- 
    // Figure out which report to generate 
    //------------------------------------- 

     if ($varRpt == "rpt1") 
     { 
      $query = "SELECT a.div_id, a.unit_id, b.unit_beg, b.unit_end, a.title_org, c.long_desc, c.short_desc FROM depunits a LEFT OUTER JOIN unitRanges b ON (a.unit_id)= (b.unit_id) LEFT OUTER JOIN orgcodes c ON (a.title_org)= (c.l1l5_id) ORDER BY a.div_id, a.unit_id" ; 

      //Column headings 
      $headings = array('Div_id','Unit Id','Unit Begin','Unit End','Title Org','Long Desc','Short Desc'); 

      // Sheet name 
      $title = "Summary Report Units/Ranges"; 

      // Name of the saved excel file 
      $filename = "Rpt1_" . date('Ymd') . ".xls"; 
     } 
     else 
      if ($varRpt == "rpt2") 
       { 

        $query = "SELECT alldiv_id, div_id, L1l2_id, L2_id, L1l3_id, L2l3_id, Exec_beg, Exec_end, Csa_id, Area_id, Area_Desc, Short_Desc, Long_Desc FROM divisions WHERE avail_ind='Y' AND active_ind='Y' ORDER BY alldiv_id "; 

        // Column Labels 
        $headings = array('All','Div','L1L2','L2','L1L3','L2L3','Exec Begin','Exec End','CSA','Area Id','Area Desc','Short Desc','Long Desc'); 

        // Report Title 
        $title = "Divisions Table"; 

        // name of the saved excel file 
        $filename = "Rpt2_" . date('Ymd') . ".xls"; 

       } // end $varRpt == "rpt2" 

       else 
        if ($varRpt == "rpt3") 
        { 
         //Column heading 
         $headings = array('Title Code','Short Title','Long Title','Status'); 

         // Report title 
         $title = "Title Codes"; 

         // Name of the saved file 
         $filename = "Rpt3_" . date('Ymd') . ".xls"; 

         if ($varCrit == "active") 
         { 
          $query = "SELECT L2l5, Stitl, Ltitl, Status FROM Tl2l5 WHERE UPPER(TRIM(status))= 'A' ORDER BY L2l5"; 
         } 
         else 
          if ($varCrit == "inactive") 
          { 
           $query = "SELECT L2l5, Stitl, Ltitl, Status FROM Tl2l5 WHERE UPPER(TRIM(status))= 'I' ORDER BY L2l5"; 
          } 
          else 
           if ($varCrit == "all") 
           { 
            $query = "SELECT L2l5, Stitl, Ltitl, Status FROM Tl2l5 ORDER BY L2l5"; 
           } 
        } 



//----------------------------------------- 
// Insert data into Excel Report template 
//----------------------------------------- 

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


    // Sheet name 
    $objPHPExcel->getActiveSheet()->setTitle('sheet1'); 

    // Set the default font type (Arial) and the size (10) 
    $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setName('Arial')->setSize(10); 

    // Set the column headings to row 3 and data to start on row 4 
    $rowHeadStart = 3; 
    $rowDataStart = 4; 

    //Merge Cells for the report titles 
    $objPHPExcel->getActiveSheet()->mergeCells("A1:T1"); // Report Title 
    $objPHPExcel->getActiveSheet()->mergeCells("A2:T2"); // Date 

    //Set Cell Text 
    $objPHPExcel->getActiveSheet()->setCellValue("A1", $title); 
    $objPHPExcel->getActiveSheet()->setCellValue('A2', date("m/d/Y")); 

    //Make Report title bold 
    $objPHPExcel->getActiveSheet()->getStyle("A1:T1")->applyFromArray(array("font" => array("bold" => true))); 
    //Make the date italicized 
    $objPHPExcel->getActiveSheet()->getStyle("A2:T2")->applyFromArray(array("font" => array("italic" => true)));   
    //Make Column headers bold 
    $objPHPExcel->getActiveSheet()->getStyle("A3:T3")->applyFromArray(array("font" => array("bold" => true))); 


    //--------------------------------------------- 
    // Loop through to display the column headings 
    //--------------------------------------------- 
    $col = 'A'; 
    foreach($headings as $heading) 
    { 
     $objPHPExcel->getActiveSheet()->setCellValue($col.$rowHeadStart,$heading); 
     $col++; 
    } // end $headings as $heading 

    //------------------------------------------------- 
    // Loop through the result set to display the data 
    //------------------------------------------------- 
    while ($row = mysql_fetch_row($result)) 
    { 
     $col = 'A'; 
     foreach($row as $cell) 
     { 
      $objPHPExcel->getActiveSheet()->setCellValue($col.$rowDataStart,$cell); 
      $objPHPExcel->getActiveSheet()->getColumnDimension($col)->setAutoSize(true); 
      $col++; 

     } // end $row as $cell 
     $rowDataStart++; 


     //----------------------- 
     // Page/Cell Formatting 
     //----------------------- 
     //Set font size for the main report title 
     $objPHPExcel->getActiveSheet()->getStyle("A1")->getFont()->setSize(16); 

     $objPHPExcel->setActiveSheetIndex(0); 

     // Left align the entire document 
     $objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); 

     // Set the page orientation to landscape 
     $objPHPExcel->getActiveSheet()->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); 

    } //end $row = mysql_fetch_row($result) 


    // Redirect output to a client’s web browser (Excel2007) 
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
    header('Content-Disposition: attachment;filename="0teste.xlsx"'); 
    header('Cache-Control: max-age=0'); 

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


    exit(); 

?> 

Недели назад отчеты были в состоянии произвести, используя код выше, но в последнее время по какой-то причине он дает мне ошибку, что файл может быть поврежден или ненадежными. Мои файлы класса PHPExcel находятся в папке проекта, поэтому пути могут быть указаны. Я не знаю, как исправить эту ошибку.

Если бы кто-нибудь мог пролить свет на этот вопрос, я был бы очень признателен.

спасибо.

+1

скачать файл, сохранить его на диск, открыть в текстовом редакторе. Появляются ли какие-либо ошибки/предупреждения php? Кроме того, если ваше сообщение об ошибке говорит о 'test.xls', почему ваш код генерирует' 0teste.xlsx'? –

+0

В дополнение к ошибкам/предупреждениям PHP, найдите в файле ведущие/завершающие пробельные символы или для ложных маркеров спецификации –

+0

@MarcB 0teste.xlsx был опечаткой. Я изменил имя файла, когда я разместил код в стеке. Но в среде IDE он назван правильно. – klm10

ответ

0

используйте

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 

вместо

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 

Я попробовал, и это работает. Thank u

Смежные вопросы