将数据库中的行转换为 excel 中的列

问题描述 投票:0回答:1

我有一个调查,我需要把它转换成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 sql arrays pivot phpexcel
1个回答
0
投票

我看到一些有问题的语法和设计决策,所以推荐一个新脚本可能更简单。您尝试重组结果集数据并没有实现真正的动态“枢轴”,因此如果用户可能没有完成所有问题,那么输出可能会出现偏差或使 PHP 向您抱怨缺少某些内容。

我对PHPExcel没有经验,但是基于使用PHPExcel制作自动生成的excel文件PDO pivot a table,足以完成这个任务。以下是未经测试的建议脚本。我确实创建了一个执行枢轴的通用演示

  1. 获取数据库结果:

    $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();
    
  2. 创建工作表、它的标题行和数据透视表数组:

    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'];
        }
    
  3. 将透视数据写入工作表的行

        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'));
            }
        }
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.