我有一个调查,我需要把它转换成excel
这是我在数据库中的表:
用户名 | 问题编号 | 回答 |
---|---|---|
1 | 1 | 5 |
1 | 2 | 3 |
2 | 1 | 4 |
2 | 2 | 1 |
我需要旋转数据并使用 PHP 类像这样填充 excel 电子表格:
用户名 | 回答 QuesId1 | 回答 QuesId2 |
---|---|---|
1 | 5 | 3 |
2 | 4 | 1 |
我的代码:
$ExportSheet2= $Link->prepare("SELECT main_data. UserId, questions.Id, Ans from main_data, questions WHERE main_data.Id = UserId and questions.Id=QuesId" );
$ExportSheet2->execute();
$ExportSheet2Count=$ExportSheet2->rowCount();
if ($ExportSheet2Count > 0) {
$objPHPExcel->createSheet();
$sheet2 = $objPHPExcel->setActiveSheetIndex(1);
$rowCount = 2;
$column = 1;
while ($row = $ExportSheet2->fetch()) {
$InfoID = $row[' UserId '];
$data[] = $row;// store data in array
}
}
$sheet2->SetCellValue('A' . $rowCount, $InfoID); //print user ID
$sheet2->SetCellValue('B' . $rowCount, mb_strtoupper($data[], 'UTF-8')); //Answer QuesId1
$sheet2->SetCellValue('C' . $rowCount, mb_strtoupper($data[], 'UTF-8')); //Answer QuesId2
我无法将问题的答案存储在数组中并填写到 excel 中。
我无法将数据存储在数组中然后将其填充到 excel 中。
我看到一些有问题的语法和设计决策,所以推荐一个新脚本可能更简单。您尝试重组结果集数据并没有实现真正的动态“枢轴”,因此如果用户可能没有完成所有问题,那么输出可能会出现偏差或使 PHP 向您抱怨缺少某些内容。
我对PHPExcel没有经验,但是基于使用PHPExcel制作自动生成的excel文件和PDO pivot a table,足以完成这个任务。以下是未经测试的建议脚本。我确实创建了一个执行枢轴的通用演示。
获取数据库结果:
$sql = <<<SQL
SELECT m.UserId,
q.Id,
Ans
FROM main_data AS m,
JOIN questions AS q
ON m.Id = q.UserId
AND m.QuesId = q.Id
ORDER BY q.Id, m.UserId
SQL;
$userSubmissions = $link->prepare($sql);
$userSubmissions->execute();
$resultSet = $userSubmissions->fetchAll();
创建工作表、它的标题行和数据透视表数组:
if ($resultSet) {
$objPHPExcel->createSheet();
$sheet = $objPHPExcel->setActiveSheetIndex(0);
$colLetter = 'A';
$rowNumber = 1;
$pivot = [];
$questionIds = [];
$sheet->SetCellValue("$colLetter$rowNumber", 'UserId');
foreach ($resultSet as $row) {
++$colLetter;
$questionIds[$row['Id']] = $row['Id'];
$sheet->SetCellValue("$colLetter$rowNumber", $row['Id']);
$pivot[$row['UserId']][$row['Id']] = $row['Ans'];
}
将透视数据写入工作表的行
foreach ($pivot as $userId => $qAndA) {
$colLetter = 'A';
++$rowNumber;
$sheet->SetCellValue("$colLetter$rowNumber", $userId);
foreach ($questionIds as $id) {
++$colLetter;
$sheet->SetCellValue("$colLetter$rowNumber", mb_strtoupper($qAndA[$id] ?? '', 'UTF-8'));
}
}
}