PHPExcel文件可能已损坏或不安全

时间:2013-12-02 21:33:21

标签: php phpexcel

当我使用PHPExcel生成Excel报告时,出现此错误:

  

“'test.xls'的文件格式和扩展名不匹配。文件   可能已损坏或不安全。除非您信任其来源,否则请勿打开   它。你想打开吗?“

这是我的设置 - 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 个答案:

答案 0 :(得分:0)

请使用

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

而不是

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

我尝试了它的确有效。 谢谢你