【问题标题】:Export from PHP to Excel从 PHP 导出到 Excel
【发布时间】:2018-05-04 13:34:29
【问题描述】:

我需要将数据从php导出到Excel,并且能够格式化excel电子表格中的各种项目。

到目前为止,我发现的最好的库是PHPExcel。但是,它似乎很重,而且有些慢。当然,它非常强大。

有没有更轻量级和更快的方法,可以让我导出到 Excel 并应用简单的格式(粗体、对齐、边框)?

【问题讨论】:

标签: php excel


【解决方案1】:

我昨天刚刚完成了这个。使用 PHPExcel,我可以毫无问题地阅读带有格式的“主”文档,写入 20-100 行内容并保存文件(我将其保存到“屏幕”以便立即下载。虽然论坛上的一些人抱怨速度和开销,我正在以它的方式推送大量数据,它做它所宣传的完全没有任何问题。

请注意,我读到的某个地方是在可能的情况下进行串联而不是循环。例如,样式 a1:a50 而不是 style->a1, style->a2 在循环中。显然,这两种不同的场景具有非常不同的内存含义。

我发现的唯一问题是输出和读取 Excel 2003 文件之间的一些怪癖。如果您完全在 XLSX 文件中工作,它的功能应该与文档完全一致。

【讨论】:

  • 我们始终建议将样式应用于范围而不是循环遍历单个单元格...它更快且使用更少的内存,并且由于共享样式,输出的 Excel 文件更小。另一个有用的样式技巧是 applyFromArray(),在数组中定义一组样式特征(粗体、颜色、背景颜色、边框等),然后在一次调用中将它们应用于单元格,而不是单独设置每个元素。
  • 是的,我肯定会尝试格式化范围而不是单元格,但老实说,这张表中根本没有那么多格式。目前,我正在导出大约 1000 行和 6 列,并在 3 行和 3 列上有一些范围格式。在我的本地主机上运行大约需要 6 秒(其中大约 1 秒是查询时间),这通常是服务器速度的一个不错的近似值。
  • @JonoB - 为了将数据写入 PHPExcel 对象,您是否查看了 PHPExcel_Worksheet 的 fromArray() 方法,而不是单独设置每个单元格的值。这可以与值绑定器一起使用,以强制对单元格值进行正确的数据类型化,以加快在内存中构建工作簿的过程。
  • 曾在一家大型国际银行的企业商店工作过,我可以告诉您,与复杂的信用卡在线系统相比,6 秒或处理时间是微不足道的。我们会很高兴有 36 秒.....
  • 当它不回答使用 PHPExcel 以外的东西的问题时,为什么这是公认的答案?
【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多