【发布时间】:2015-09-07 16:09:19
【问题描述】:
到目前为止,我已经通过 PHPExcel 成功地将数据从 Mysql 导出到 Excel,制作了我的表格,格式化了,一切都很好。
然而,到目前为止,任何从上述表格制作图表的尝试都失败了。不仅如此,在 Google 搜索结束几天后,我还没有找到关于如何从 MySQL 填充图形值的简单示例/教程。
这一切都归结为:
Taken from https://github.com/affinitybridge/phpexcel/blob/master/Tests/33chartcreate-pie.php
/** PHPExcel */
include 'PHPExcel.php';
$objPHPExcel = new PHPExcel();
$objWorksheet = $objPHPExcel->getActiveSheet();
$objWorksheet->fromArray(
array(
array('', 2010, 2011, 2012),
array('Q1', 12, 15, 21),
array('Q2', 56, 73, 86),
array('Q3', 52, 61, 69),
array('Q4', 30, 32, 0),
)
);
我到底如何从 a) Mysql 或 b) excel 填充 $objWorksheet->fromArray。
如果是 SQL,我需要对数据库中的所有表运行此查询。
$sql = "SELECT Functional_Area, Passed__Status, Blocked__Status, Failed__Status FROM $tbl_name WHERE 1;
上下文:我有几个功能区,每个功能区在 Passed/Failed/Blocked 中都有不同的值。我需要每个功能区域的 1 个图表。每个表平均有 14 个功能区域。
然后我会为每个功能区域构建一个饼图(或条形图,我不挑剔)。
选项 2) Excel
由于我已经在 Excel 中说过数据,我需要从以下位置填充数据:
同样,每行 1 个图表(第 5 行 (FA = EPG) 将是 1 个图表,第 6 行 (FA = VOD) 将是另一个图表,等等...)。
必须为每个工作表重复此操作...
到目前为止,我的尝试如下,这会为每个工作表(这很好)生成一个图表,但是它是空的(不好)。
foreach (glob("*.xls") as $f)
{
$inputFileName = $f;
echo "Found $inputFileName <br/>";
}
// Read your Excel workbook
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
$i = 0;
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet)
{
$arrayData[$worksheet->getTitle()] = $worksheet->toArray();
echo "Title: ".$worksheet->getTitle()."<br/>";
$wsTitle = $worksheet->getTitle();
$objWorksheet = $objPHPExcel->setActiveSheetIndexByName($wsTitle);
$highestRow = $worksheet->getHighestRow(); // e.g. 10
$endofData = $highestRow -1;
$highestColumn = $worksheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
$colNumberStart = PHPExcel_Cell::columnIndexFromString("D");
$BeforeTOT = $colNumberStart - 2;
$TOT = $colNumberStart - 1;
echo "Highest Row is ==> $highestRow <br/>End of Data - header is $endofData <br/> Highest Col is ==> $highestColumn <br/> Start col is ==> $colNumberStart and Highest Col end is ==> $highestColumnIndex <br/>";
// 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
${'dataseriesLabels' . $i} = array(
new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$4', null, 1), // 2010
new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$G$4', null, 1), // 2011
new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$H$4', null, 1), // 2012
new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$I$4', null, 1), // 2012
);
displayArray(${'dataseriesLabels' . $i});
// Set the X-Axis Labels
// Datatype
// Cell reference for data
// Format Code
// Number of datapoints in series
// Data values
// Data Marker
${'xAxisTickValues' . $i} = array(
new PHPExcel_Chart_DataSeriesValues('String', 'Worksheet!$D$4:$H$4', null, 19), // Q1 to Q4
);
displayArray(${'xAxisTickValues' . $i});
// 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
${'dataSeriesValues' . $i} = array(
new PHPExcel_Chart_DataSeriesValues('Number', 'Worksheet!$G$5:$I$5', null, 4),
);
displayArray(${'dataSeriesValues' . $i});
// Build the dataseries
${'series' . $i} = new PHPExcel_Chart_DataSeries(
PHPExcel_Chart_DataSeries::TYPE_PIECHART, // plotType
PHPExcel_Chart_DataSeries::GROUPING_PERCENT_STACKED, // plotGrouping
range(0, count(${'dataseriesLabels' . $i})-1), // plotOrder
${'dataseriesLabels' . $i}, // plotLabel
${'xAxisTickValues' . $i}, // plotCategory
${'dataSeriesValues' . $i} // plotValues
);
displayArray(${'series' . $i});
// Set the series in the plot area
${'plotarea' . $i} = new PHPExcel_Chart_PlotArea(null, array(${'series' . $i}));
// Set the chart legend
${'legend' . $i} = new PHPExcel_Chart_Legend(PHPExcel_Chart_Legend::POSITION_TOPRIGHT, null, false);
${'title' . $i} = new PHPExcel_Chart_Title('Test %age-Stacked Area Chart');
${'yAxisLabel' . $i} = new PHPExcel_Chart_Title('Value ($k)');
// Create the chart
${'chart' . $i} = new PHPExcel_Chart(
'chart1', // name
${'title' . $i}, // title
${'legend' . $i}, // legend
${'plotarea' . $i}, // plotArea
true, // plotVisibleOnly
0, // displayBlanksAs
null, // xAxisLabel
${'yAxisLabel' . $i} // yAxisLabel
);
// Set the position where the chart should appear in the worksheet
${'chart' . $i}->setTopLeftPosition('A7');
${'chart' . $i}->setBottomRightPosition('H20');
// Add the chart to the worksheet
$objWorksheet->addChart(${'chart' . $i});
// 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
// Save Excel 2007 file
echo date('H:i:s') , " Write to Excel2007 format" , EOL;
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->setIncludeCharts(TRUE);
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
// Echo memory peak usage
echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;
// Echo done
echo date('H:i:s') , " Done writing file" , EOL;
echo 'File has been created in ' , getcwd() , EOL;
$i++;
}
【问题讨论】:
-
如果您已经“通过 PHPExcel 成功地将数据从 Mysql 导出到 Excel”,那么您不需要使用
fromArray()重新填充它......fromArray()只是一个该方法将在一次调用中从 PHP 数据数组中设置一系列单元格值....它不以任何方式特定于图表 -
确实,一开始就可以通过 fromArray 将 Mysql 中的值导出并转储到 Excel 中。例如:` $sql = "SELECT * FROM $value"; $arr = db_select($sql); $objPHPExcel->getActiveSheet()->fromArray($arr, NULL, 'C5');` 将查询 $sql 的内容转储到 excel 表中(为清楚起见,代码缩短了)...但是,我所有的图表都有空白值我能想到的唯一原因是我没有填充 fromArray 值?
-
如果您保存的工作表没有图表,那么您可以检查保存文件中的值以确保它们存在
-
但首先要注意....您正在使用变量
$wsTitle设置工作表名称,但是您在调用中引用的单元格范围以设置图表数据系列都引用Worksheet作为工作表名称....Worksheet不是“魔术词” -
当您在 Excel 工作表中看到
Worksheet!$I$4或'Worksheet!$G$5:$I:5之类的内容时,它是单元格或区域引用:!之前的部分是工作表名称,@ 之后的部分987654337@ 是该工作表中的单元格或单元格范围.....这是标准 Excel
标签: php mysql excel phpexcel phpexcelreader