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

使用PHPExcel导出MySQL数据:按行拆分后以||分隔字段至Excel列

解决MySQL数据按自定义分隔符拆分后导出到Excel的问题

看起来你已经搞定了按::拆分行的第一步,接下来只要把每行里的||字段拆到不同列就可以了。我帮你调整一下查询和PHP代码,完美实现需求:

首先先修正你的MySQL查询(原来的查询有语法错误),我们需要用数字表把DESCRIPTION里的::分隔内容拆成单独的行:

SELECT 
    s.ID,
    -- 拆分出每个::分隔的独立行内容
    SUBSTRING_INDEX(SUBSTRING_INDEX(s.DESCRIPTION, '::', n.n), '::', -1) AS row_content
FROM 
    SAMPLE s
INNER JOIN 
    numbers n ON CHAR_LENGTH(s.DESCRIPTION) - CHAR_LENGTH(REPLACE(s.DESCRIPTION, '::', '')) >= n.n - 1
ORDER BY 
    s.ID, n.n;

如果你没有现成的numbers表,可以用临时生成的数字序列替代,比如最多拆5行的话:

INNER JOIN 
    (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) n 
ON CHAR_LENGTH(s.DESCRIPTION) - CHAR_LENGTH(REPLACE(s.DESCRIPTION, '::', '')) >= n.n - 1

行数不够就继续加UNION ALL SELECT X。

然后是修改后的PHP导出代码,重点在拆分||字段和修复行号递增的问题(你原来的代码没加$rowCount++,会把所有数据写到同一行!):

<?php
error_reporting(E_ALL);
require_once 'Classes/PHPExcel.php';

try {
    // 替换成你的数据库信息
    $dbhost = '你的数据库主机';
    $dbuser = '你的用户名';
    $dbpass = '你的密码';
    $dbname = '你的数据库名';

    // 注意:mysql扩展已废弃,建议后续换成mysqli或PDO,这里先兼容你的现有代码
    $connect = @mysql_connect($dbhost, $dbuser, $dbpass) or die("Couldn't connect to MySQL:<br>" . mysql_error() . "<br>" . mysql_errno());
    $Db = @mysql_select_db($dbname, $connect) or die("Couldn't select database:<br>" . mysql_error(). "<br>" . mysql_errno());

    // 使用修正后的查询语句
    $sql = "SELECT 
                s.ID,
                SUBSTRING_INDEX(SUBSTRING_INDEX(s.DESCRIPTION, '::', n.n), '::', -1) AS row_content
            FROM 
                SAMPLE s
            INNER JOIN 
                numbers n ON CHAR_LENGTH(s.DESCRIPTION) - CHAR_LENGTH(REPLACE(s.DESCRIPTION, '::', '')) >= n.n - 1
            ORDER BY 
                s.ID, n.n;";

    $result = @mysql_query($sql,$connect) or die("Couldn't execute query:<br>" . mysql_error(). "<br>" . mysql_errno());

    // 初始化PHPExcel
    $objPHPExcel = new PHPExcel();
    $activeSheet = $objPHPExcel->getActiveSheet();
    $objPHPExcel->setActiveSheetIndex(0);

    // 设置表头,可根据你的实际字段含义调整
    $activeSheet->setCellValue('A1', 'ID');
    $activeSheet->setCellValue('B1', 'Detail');
    $activeSheet->setCellValue('C1', 'Response');
    $activeSheet->setCellValue('D1', 'Status');

    $rowCount = 2;
    while($row = mysql_fetch_array($result)){
        // 写入ID列
        $activeSheet->setCellValue('A'.$rowCount, $row['ID']);
        
        // 按||拆分当前行的内容,去掉前后空格
        $fields = array_map('trim', explode('||', $row['row_content']));
        
        // 将拆分后的字段写入对应列
        if(isset($fields[0])) $activeSheet->setCellValue('B'.$rowCount, $fields[0]);
        if(isset($fields[1])) $activeSheet->setCellValue('C'.$rowCount, $fields[1]);
        if(isset($fields[2])) $activeSheet->setCellValue('D'.$rowCount, $fields[2]);
        // 如果有更多字段,继续添加E、F列即可

        $rowCount++; // 必须递增行号,不然会覆盖之前的内容
    }

    // 输出Excel文件
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="SampleExcel.xls"');
    header('Cache-Control: max-age=0');
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
} catch (Exception $ex) {
    echo 'Message: ' .$ex->getMessage();
}
?>

额外提醒下:mysql_*系列函数在PHP7及以上版本已经被移除了,建议后续把代码迁移到mysqli或者PDO,避免以后升级PHP出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:02:29