在PHP中创建XLS文件的最佳方法是什么?

24

我目前正在尝试找到从PHP创建.xls文件的最佳方法。在我看来,我只需要将头部内容类型更改为"application/vnd.ms-excel",然后以逗号分隔的格式输出数据即可。这是最佳的做法吗?

谢谢任何帮助!
Metropolis

编辑

直接将数据以HTML形式输出会有什么问题吗?我已经有一个类可以用于解决此问题,所以我宁愿避免使用第三方解决方案。我只需要知道以什么方式输出数据才能在该文件格式中获得最佳效果。

在查看了PHPExcel后,它似乎是解决此问题的最佳解决方案。感谢您所有人的答案,如果可以的话,我会选择三个正确的答案,哈哈。但是点赞就可以了 :)


1
将头文件内容类型更改为“application/vnd.ms-excel”,然后使用HTML、TAB或CSV格式的文本内容编写XLS文件即可。但是,这是一种技巧,因为MS Excel将能够打开该文件,即使它不是真正的二进制XLS文件,但您将无法使用任何Excel功能(例如多个工作表)。我使用的一个方法是MS Excel应用程序本身,参见这里。我使用的另一种方法是这个 - Mario Z
9个回答

19

很简单,因为Excel支持HTML代码。所以,您只需要在文件顶部添加一个标头...然后输出您的HTML代码!

header ( "Content-type: application/vnd.ms-excel" );
header ( "Content-Disposition: attachment; filename=foo_bar.xls" );
echo "<table><tr><th>Header1</th></tr><tr><td>value1</td></tr></table>";

这将生成一个 Excel 文件!


如何生成多个表格?只需关闭并重新打开<table>即可吗? - Meloman
5
这不是它的工作方式,这也不是所有这些的工作方式。仅仅在HTML输出中添加“伪造”的MIME头并不能得到一个Excel文件。打开一个带有错误文件扩展名的HTML摘录只会在一些Excel警告之后触发一个尽力而为的导入功能。几乎不可靠。 - mario
1
嘿@mario,我已经使用大多数框架从PHP创建了测试Excel,并返回(example.xls)元素表(与HTML相同),为什么不使用这种方法,如果它可以100%工作? - Abdul Aziz Al Basyir

18

这取决于您想要CSV文件还是XLS文件。 XLS文件可以包含单元格的格式信息,以及行/列锁定、保护和其他无法在CSV文件中实现的特性。 此外,请记住,Excel在打开CSV文件时不支持正确的UTF-8编码内容。

如果您想要一个带格式的XLS文件,则需要使用类似于 PhpSpreadsheet 这样的库来编写具有格式的文件,或者如果您的服务器安装了Excel,则需要使用COM。


3
你可以使用 Microsoft Office 理解的 XML 格式 之一。
有关详细信息/规格,请参见 Microsoft 的 OpenXML Developer 网站。
有一个名为 PHPExcel 的库可供查看,以帮助您完成此操作。
当然,这完全取决于您所指的:

“充分利用该文件格式”

如果您只有简单的表格而没有格式,则可能只需要 CSV 文件;但是,如果您想使用电子表格的更多功能,我建议您查看 OpenXML。

2

您可以直接输出html,新版本的Excel将能够读取它。然而,我不知道您能用它做多少格式化。

如果您需要数据类型、丰富的格式化或公式,我用PHPExcel取得了成功。

我的首选是编写CSV文件。CSV是一种非常容易编写的格式,也易于从现有的HTML表格脚本进行转换。它还具有被广泛非微软电子表格程序读取的优点。如果您能使CSV成为Web应用程序的首选文件格式,那么当您必须接受电子表格作为输入时,您将会获得回报。读取和解析CSV文件比Excel文件要容易得多。


1
我同意你关于CSV文件的看法,Scott。如果由我决定的话,我也会使用这种格式。但不幸的是,我需要使用XLS。 - Metropolis

1

1

1

免责声明:我在Expected Behavior工作,这是开发DocRaptor的公司。

话虽如此,您可以使用DocRaptor从HTML生成XLS文件。 DocRaptor是一个Ruby on Rails项目,但您也可以将其与PHP一起使用。以下是我们的PHP示例:

DocRaptor PHP示例

这是另一个链接到DocRaptor主页的链接:

使用DocRaptor将HTML转换为Excel


-1
你可以开始使用这些文件。它将创建一个 Excel 文件并帮助您下载它。
您可以像这样添加行:

01-simple-download-xlsx.php

$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Roll')
            ->setCellValue('B1', 'Name')
            ->setCellValue('C1', 'Total Classes')
            ->setCellValue('D1', 'Class Attended')
        ->setCellValue('E1', 'Percentage');

您可以使用 while 循环从数据库中打印数据,如下所示。

$i=2;   
while ($row = $database->fetch_array($result)) 
 { 

       $objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A'.$i, $row[0])
            ->setCellValue('B'.$i, $row[1])
            ->setCellValue('C'.$i, $row[2])
            ->setCellValue('D'.$i, $total)
        ->setCellValue('E'.$i, round(($row[2]/$total)*100));
          $i++;
 }

-1

是的,那是一种可能的方法 - 如果您需要一个可以在Ms Excel中打开的普通CSV文件。

如果您需要一个丰富的XLS文件,有许多选项,包括使用第三方DLL(如'CarlosAg.ExcelXmlWriter.dll')来创建XLS文件。您可以在网络上搜索使用此dll的示例或在这里查看


关于Linux,外部库不是正确的选择,你不知道它们会被维护多久,也不知道里面有什么。 - user7082181

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