将MySQL数据导出到Excel矩阵中

时间:2012-02-07 21:51:15

标签: php mysql excel export-to-excel

我有一个名为“relations”的MySQL表,如下所示:

from to count
-------------
A    B  456
A    C  233
A    D  463
B    A  766
B    C  215
B    D  142

(实际上,“from”和“to”包含人名,表包含150行)。我现在需要将此表导出为(150x150)矩阵形式的excel文件(而不是CSV),如下所示:

  |  A    B    C   D
--+------------------
A |  0   456  233 463
B | 766   0   215 142

我需要在PHP中执行此操作,但不知道如何解决此问题。我是否首先创建一个空Excel文件,命名所有行和列? (所以这样:):

  |  A    B    C   D
--+------------------
A |
B |

如果我这样做,那么如何连接到正确的单元格以插入正确的计数?或者我是否一起从PHP中编写Excel文件?

另外,实际上表格没有结构化,所以它看起来像:

from to
-------
A    C
F    K
F    L
B    Z
M    P
P    A

所以我认为我无法逐行逐行写入。或者我应该首先查询数据库,按列“from”排序,然后按“to”列排序,可能。

非常感谢帮助我入门的任何帮助。

3 个答案:

答案 0 :(得分:1)

您可能希望使用Pear::Spreadsheet_Excel_Writer,它们提供了很好的示例here,例如:

<?php
require_once 'Spreadsheet/Excel/Writer.php';

// Creating a workbook
$workbook = new Spreadsheet_Excel_Writer();

// sending HTTP headers
$workbook->send('test.xls');

// Creating a worksheet
$worksheet =& $workbook->addWorksheet('My first worksheet');

// The actual data
$worksheet->write(0, 0, 'Name');
$worksheet->write(0, 1, 'Age');

非常简单易用。

但我的亲身经历:如果你需要写大量数据,请不要使用它,我节省了8列和6万行,前10 000行需要大约2分钟,接下来10 000大约45分钟3个小时后我停止了脚本,然后达到30 000.我最终使用了perl variant,花了大约3分钟完成了6万行。

具有讽刺意味的是,我现在正在Excel中使用CSV导入:)

答案 1 :(得分:1)

Excel也会理解html表格。所以你可以:

  1. 获取数据
  2. 迭代并构建一个表格,就像您希望Excel中出现一样
  3. 设置要下载的标头和MIME类型。
  4. 在Excel中打开(您将收到一条警告消息)。
  5. 标题看起来像这样:

    <?php
    [..]
    header('Content-Type: application/force-download');
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    header('Expires: 0');
    [..]
    ?>
    

    还要考虑这些,以便浏览器不缓存文件:

    if (isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false)) {
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
      header('Pragma: public');
    } else {
      header('Pragma: no-cache');
    }
    

答案 2 :(得分:0)

  • 从mysql中获取数据
  • 使用获取的数据构建数组(您的数据库数据的顺序无关紧要,您可以随时按键/值对数组进行排序)
  • 使用PHPExcel(或ExcelWriter类或其他)生成excel文件
  • 生成您的文件,逐行col地迭代数据数组col。