我有一个名为“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”列排序,可能。
非常感谢帮助我入门的任何帮助。
答案 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表格。所以你可以:
标题看起来像这样:
<?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)