从PHP导出到Excel

7
我需要从php导出数据到Excel,并能够在Excel电子表格中格式化各种项目。
到目前为止,我找到的最好的库是PHPExcel。然而,它似乎非常沉重,而且有点慢。当然,它非常强大。
是否有更轻量级和更快速的东西,允许我导出到excel并能够应用简单的格式(粗体,对齐,边框)?

3
我在一周左右前回答了这个问题:https://dev59.com/dm865IYBdhLWcg3wNLw7#3931142。 - Mark Baker
2个回答

3

我昨天刚刚完成了这个任务。使用PHPExcel,我读取了一个带有格式的“主”文档,写入了20-100行内容,并将文件保存下来(我将其“保存到屏幕”以便立即下载)。虽然一些人在论坛上抱怨速度和开销,但我向它传递了大量数据,它完全可以做到它所声称的。

请注意,在某个地方我读到要尽可能在系列中进行样式设置,而不是在循环中进行设置。例如,将a1:a50设置为样式,而不是在循环中使用style->a1,style->a2。显然,这两种不同的情况具有非常不同的内存影响。

我唯一发现的问题是输出和读取Excel 2003文件之间存在一些小问题。如果您完全在XLSX文件中工作,则应该与文档中描述的完全相同。


我们总是建议将样式应用于范围,而不是循环遍历单个单元格...这样更快,占用的内存更少,并且由于共享样式,输出的Excel文件更小。另一个有用的样式技巧是applyFromArray(),在数组中定义一组样式特征(加粗、颜色、背景颜色、边框等),然后在单个调用中将它们应用于单元格,而不是单独设置每个元素。 - Mark Baker
是的,我肯定会尝试格式化范围而不是单元格,但说实话,这张表格中真的没有太多的格式。目前,我正在导出大约1000行和6列,其中有3行和3列的一些范围格式。在我的本地主机上运行需要大约6秒钟(其中大约1秒钟是查询时间),这通常是服务器速度的一个不错的近似值。 - JonoB
@JonoB - 对于将数据写入PHPExcel对象,您是否尝试过使用PHPExcel_Worksheet的fromArray()方法而不是逐个设置每个单元格的值。这可以与Value Binder一起使用,以强制正确地将单元格值转换为数据类型,从而加快在内存中构建工作簿的过程。 - Mark Baker
在一家国际大银行的企业中工作过,我可以告诉你,相比于信用卡系统的复杂性,6秒处理时间微不足道。我们会对36秒感到满意。 - bpeterson76
为什么这个被接受的答案并没有回答如何使用除了PHPExcel之外的东西的问题? - Bryan C.
@BryanC。自2010年以来,这个问题已经被编辑了几次... - bpeterson76

2
这是一个简单的Excel文件生成函数,非常快速并且生成的是确切的.xls文件。
$filename = "sample_php_excel.xls";
$data = array(
array("User Name" => "Abid Ali", "Q1" => "$32055", "Q2" => "$31067", "Q3" => 32045, "Q4" => 39043),
array("User Name" => "Sajid Ali", "Q1" => "$25080", "Q2" => "$20677", "Q3" => 32025, "Q4" => 34010),
array("User Name" => "Wajid Ali", "Q1" => "$93067", "Q2" => "$98075", "Q3" => 95404, "Q4" => 102055),
);
to_xls($data, $filename);

function to_xls($data, $filename){
$fp = fopen($filename, "w+");
$str = pack(str_repeat("s", 6), 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); // s | v
fwrite($fp, $str);
if (is_array($data) && !empty($data)){
    $row = 0;
    foreach (array_values($data) as $_data){
        if (is_array($_data) && !empty($_data)){
            if ($row == 0){
                foreach (array_keys($_data) as $col => $val){
                    _xlsWriteCell($row, $col, $val, $fp);
                }
                $row++;
            }
            foreach (array_values($_data) as $col => $val){
                _xlsWriteCell($row, $col, $val, $fp);
            }
            $row++;
        }
    }
}
$str = pack(str_repeat("s", 2), 0x0A, 0x00);
fwrite($fp, $str);
fclose($fp);
}

function _xlsWriteCell($row, $col, $val, $fp){
if (is_float($val) || is_int($val)){
    $str  = pack(str_repeat("s", 5), 0x203, 14, $row, $col, 0x0);
    $str .= pack("d", $val);
} else {
    $l    = strlen($val);
    $str  = pack(str_repeat("s", 6), 0x204, 8 + $l, $row, $col, 0x0, $l);
    $str .= $val;
}
fwrite($fp, $str);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接