使用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
相关产品推荐
相关产品推荐

