当我使用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类文件位于我的项目文件夹中,因此可以引用路径。我不确定如何解决这个错误。
如果有人能对这个问题有所启发,我会非常感激。
谢谢。
答案 0 :(得分:0)
请使用
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
而不是
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
我尝试了它的确有效。 谢谢你