使用Microsoft Excel打开时, PHPExcel生成的excel文件不起作用(文件格式或扩展名无效)吗?如果你是这个可怕问题的受害者, 则可能有很多因素导致此消息。
如果你使用的是纯PHP, 则使用以下代码:
$excelWriter->
save("php://output");
Mark Ba??ker(PHPOffice开发人员)说:
检查你的脚本, 以查看将其发送到php:// output流的位置。检查初始< ?php开头标记之前是否没有空格;特别要注意?> < ?php或类似的关闭/打开标签。并检查脚本可能包含的所有文件。在这里阅读更多这是很难实现的, 因为很难检查标记之间的文件之间是否有空格(如果你使用的是symfony之类的框架, 这将是一项艰巨的任务), 但是有些开发人员使用:
ob_end_clean();
// ob_end_clean Cleans the output buffer and turn off output buffering$excelWriter->
save("php://output");
如果先前的解决方案对你不起作用, 那么你只剩下一个选择, 但是在继续之前, 你应该了解一些重要的注意事项:
- 流式响应几乎总是会生成损坏的文件。
- PHPExcel可能不是损坏文件的唯一罪魁祸首, 在大多数情况下, 你的代码(绘制数据的方式)可能已损坏。
- 使用save方法将文件保存在服务器中的某个位置, 然后根据需要生成文件下载(直接或间接)。
// Remove the \ before every class if you're using plain php ( new \PHP_Something)public function createexcelfileAction() {// if you are using plain php use instead,
//$excel = new PHPExcel();
$excel = $this->
get('phpexcel')->
createPHPExcelObject();
$excel->
createSheet();
$excel->
setActiveSheetIndex(1);
$excel->
getActiveSheet()->
setTitle('ChartTest');
$objWorksheet = $excel->
getActiveSheet();
$objWorksheet->
fromArray(
array(
array('', 'Rainfall (mm)', 'Temperature (°F)', 'Humidity (%)'),
array('Jan', 78, 52, 61),
array('Feb', 64, 54, 62),
array('Mar', 62, 57, 63),
array('Apr', 21, 62, 59),
array('May', 11, 75, 60),
array('Jun', 1, 75, 57),
array('Jul', 1, 79, 56),
array('Aug', 1, 79, 59),
array('Sep', 10, 75, 60),
array('Oct', 40, 68, 63),
array('Nov', 69, 62, 64),
array('Dec', 89, 57, 66),
)
);
//
Set the Labels for each data series we want to plot
//
Datatype
//
Cell reference for data
//
Format Code
//
Number of datapoints in series
//
Data values
//
Data Marker
$dataseriesLabels1 = array(
new \PHPExcel_Chart_DataSeriesValues('String', 'Grafico!$B$1', NULL, 1), //
Temperature
);
$dataseriesLabels2 = array(
new \PHPExcel_Chart_DataSeriesValues('String', 'Grafico!$C$1', NULL, 1), //
Rainfall
);
$dataseriesLabels3 = array(
new \PHPExcel_Chart_DataSeriesValues('String', 'Grafico!$D$1', NULL, 1), //
Humidity
);
//
Set the X-Axis Labels
//
Datatype
//
Cell reference for data
//
Format Code
//
Number of datapoints in series
//
Data values
//
Data Marker
$xAxisTickValues = array(
new \PHPExcel_Chart_DataSeriesValues('String', 'Grafico!$A$2:$A$13', NULL, 12), //
Jan to Dec
);
//
Set the Data values for each data series we want to plot
//
Datatype
//
Cell reference for data
//
Format Code
//
Number of datapoints in series
//
Data values
//
Data Marker
$dataSeriesValues1 = array(
new \PHPExcel_Chart_DataSeriesValues('Number', 'Grafico!$B$2:$B$13', NULL, 12),
);
//
Build the dataseries
$series1 = new \PHPExcel_Chart_DataSeries(
\PHPExcel_Chart_DataSeries::TYPE_BARCHART, // plotType
\PHPExcel_Chart_DataSeries::GROUPING_CLUSTERED, // plotGrouping
range(0, count($dataSeriesValues1) - 1), // plotOrder
$dataseriesLabels1, // plotLabel
$xAxisTickValues, // plotCategory
$dataSeriesValues1
// plotValues
);
//
Set additional dataseries parameters
//
Make it a vertical column rather than a horizontal bar graph
$series1->
setPlotDirection(\PHPExcel_Chart_DataSeries::DIRECTION_COL);
//
Set the Data values for each data series we want to plot
//
Datatype
//
Cell reference for data
//
Format Code
//
Number of datapoints in series
//
Data values
//
Data Marker
$dataSeriesValues2 = array(
new \PHPExcel_Chart_DataSeriesValues('Number', 'Grafico!$C$2:$C$13', NULL, 12),
);
//
Build the dataseries
$series2 = new \PHPExcel_Chart_DataSeries(
\PHPExcel_Chart_DataSeries::TYPE_LINECHART, // plotType
\PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping
range(0, count($dataSeriesValues2) - 1), // plotOrder
$dataseriesLabels2, // plotLabel
NULL, // plotCategory
$dataSeriesValues2
// plotValues
);
//
Set the Data values for each data series we want to plot
//
Datatype
//
Cell reference for data
//
Format Code
//
Number of datapoints in series
//
Data values
//
Data Marker
$dataSeriesValues3 = array(
new \PHPExcel_Chart_DataSeriesValues('Number', 'Grafico!$D$2:$D$13', NULL, 12),
);
//
Build the dataseries
$series3 = new \PHPExcel_Chart_DataSeries(
\PHPExcel_Chart_DataSeries::TYPE_AREACHART, // plotType
\PHPExcel_Chart_DataSeries::GROUPING_STANDARD, // plotGrouping
range(0, count($dataSeriesValues2) - 1), // plotOrder
$dataseriesLabels3, // plotLabel
NULL, // plotCategory
$dataSeriesValues3
// plotValues
);
//
Set the series in the plot area
$plotarea = new \PHPExcel_Chart_PlotArea(NULL, array($series1, $series2, $series3));
//
Set the chart legend
$legend = new \PHPExcel_Chart_Legend(\PHPExcel_Chart_Legend::POSITION_RIGHT, NULL, false);
$title = new \PHPExcel_Chart_Title('Chart awesome');
//
Create the chart
$chart = new \PHPExcel_Chart(
'chart1', // name
$title, // title
$legend, // legend
$plotarea, // plotArea
true, // plotVisibleOnly
0, // displayBlanksAs
NULL, // xAxisLabel
NULL
// yAxisLabel
);
//
Set the position where the chart should appear in the worksheet
$chart->
setTopLeftPosition('F2');
$chart->
setBottomRightPosition('O16');
//
Add the chart to the worksheet
$objWorksheet->
addChart($chart);
// if you're using plain php use instead :// $writer = new PHPExcel_Writer_Excel2007($excel);
$writer = $this->
get('phpexcel')->
createWriter($excel, 'Excel2007');
$writer->
setIncludeCharts(TRUE);
// Save the file somewhere in your project
$writer->
save('file.xlsx');
// then your file will be not corrupted anymore// Do not use streamed responses with excel files that include charts ! otherwise it will get corrupted
/**
$response = $this->
get('phpexcel')->
createStreamedResponse($writer);
// adding headers
$dispositionHeader = $response->
headers->
makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
'stream-file.xlsx'
);
$response->
headers->
set('Content-Type', 'text/vnd.ms-excel;
charset=utf-8');
$response->
headers->
set('Pragma', 'public');
$response->
headers->
set('Cache-Control', 'maxage=1');
$response->
headers->
set('Content-Disposition', $dispositionHeader);
**/
// YOU NEED TO GIVE YOUR OWN RESPONSE, OTHERWISE THIS WILL THROW ERROR
return 'Create your own response';
}
如果一切正常, 则生成的excel文件将是具有以下内容的普通excel文件(并且没有损坏的文件消息):
文章图片
现在一切都应该井井有条, 但是你需要测试使用save方法(而不是流式响应)保存文件的代码。
如果文件仍然损坏, 则绝对应该重新评估代码, 并检查是否使用感知数据进行渲染, 因为这可能是问题所在。
【使用PHPExcel使用图表生成的Excel文件会因Symfony中的流响应而损坏-PHP】如果你在此处访问官方的phpexcel github存储库, 则可以获取更多图表示例, 其中有许多示例说明了如何使用不同类型的图表。愿原力与你同在 !
推荐阅读
- 使用readme.md文件中的Github Markdown可能不知道的提示和技巧
- 如何在Symfony中获取教条查询状态(信息)
- 在Symfony 3中的表单上实现Google reCAPTCHA
- 终极版/反应。实现后,combineReducers无法获得app的状态
- Android / Java,如何在某些字段中使用换行和逗号来处理csv文件()
- Google BigQuery APPROX_QUANTILES并获得真正的四分位数
- Swift didReceiveRemoteNotification - 无论app用户位于何处,都可以导航到rootviewcontroller(现在有错误信息)
- 如果用户在由本机生成的应用程序上隐藏了较低的硬件导航栏,则Android屏幕不适合
- Android Studio错误的含义(未注释的参数会覆盖@NonNull参数)