You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现数据库行转Excel列:问卷数据透视导出问题求助

解决问卷数据转Excel透视表问题

核心问题分析

你的代码存在以下关键问题:

  • SQL查询语法错误:关联条件和字段引用有误,导致数据读取不准确
  • 数组存储逻辑错误:未按UserId分组存储对应QuesId的答案,无法实现透视效果
  • Excel填充逻辑错误:直接使用data[]是无效语法,且未按用户和问题维度匹配数据
  • 变量作用域问题:$sheet2和$InfoID可能在无数据时未定义,引发报错

修正后的完整代码

// 1. 修正SQL查询:正确关联表并获取所需字段
$ExportSheet2 = $Link->prepare("
    SELECT main_data.UserId, questions.Id AS QuesId, main_data.Ans 
    FROM main_data 
    JOIN questions ON main_data.QuesId = questions.Id
");

$ExportSheet2->execute();
$ExportSheet2Count = $ExportSheet2->rowCount(); 

if ($ExportSheet2Count > 0) {
    $objPHPExcel->createSheet();
    $sheet2 = $objPHPExcel->setActiveSheetIndex(1);
    
    // 2. 按UserId分组存储答案,结构为 $userAnswers[userId][quesId] = answer
    $userAnswers = [];
    $allQuesIds = []; // 收集所有问题ID用于生成表头
    
    while ($row = $ExportSheet2->fetch(PDO::FETCH_ASSOC)) {
        $userId = trim($row['UserId']);
        $quesId = $row['QuesId'];
        $answer = $row['Ans'];
        
        $userAnswers[$userId][$quesId] = mb_strtoupper($answer, 'UTF-8');
        $allQuesIds[$quesId] = true; // 去重存储问题ID
    }
    
    // 3. 生成表头:A列是用户ID,后续列是各问题ID
    $sheet2->setCellValue('A1', '用户ID');
    $column = 2;
    $quesIdToColumn = []; // 映射问题ID到Excel列号
    
    foreach (array_keys($allQuesIds) as $quesId) {
        $sheet2->setCellValueByColumnAndRow($column, 1, "问题ID: {$quesId}");
        $quesIdToColumn[$quesId] = $column;
        $column++;
    }
    
    // 4. 填充用户数据行
    $rowCount = 2;
    foreach ($userAnswers as $userId => $answers) {
        // 写入用户ID到A列
        $sheet2->setCellValue("A{$rowCount}", $userId);
        
        // 写入每个问题的答案到对应列
        foreach ($quesIdToColumn as $quesId => $col) {
            $answer = isset($answers[$quesId]) ? $answers[$quesId] : '';
            $sheet2->setCellValueByColumnAndRow($col, $rowCount, $answer);
        }
        
        $rowCount++;
    }
} else {
    // 处理无数据的情况
    $objPHPExcel->createSheet();
    $sheet2 = $objPHPExcel->setActiveSheetIndex(1);
    $sheet2->setCellValue('A1', '无可用数据');
}

关键改进点

  • 数据分组:用$userAnswers[$userId][$quesId]结构存储数据,清晰对应每个用户的每个问题答案
  • 表头生成:自动收集所有问题ID并生成表头,适配任意数量的问题
  • 安全填充:检查每个用户是否有对应问题的答案,无数据时填充空值
  • 语法修正:修复SQL关联逻辑和Excel单元格赋值的错误语法

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:37:46