如何在不使用任何excel库PHP的情况下创建xlsx文件

时间:2011-05-19 07:47:48

标签: php xlsx

现在我正在使用。

$mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
header('Content-Description: File Transfer');
header('Content-Type: ' . $mimeType);
header('Content-Disposition: attachment; filename='.basename($type.'.xlsx'));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');   
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
print "$header\n$data";
exit;

$header变量包含要生成的excel标题行,看起来像这样

$header= "Business_Name\tBusiness_Type\tType";

\t

分隔

$data包含要在标题列下生成的行。它们也由\t分隔,行由\n终止。

当前安装文件已下载但未使用ms excel打开并显示此消息。

  

Excel无法打开文件“文件名”   因为文件格式或文件   扩展无效。验证   文件格式尚未损坏   并且文件扩展名匹配   文件的格式。

应该向服务器发送什么标头?或者我如何生成该文件?

3 个答案:

答案 0 :(得分:15)

我以快速,有点小气的方式实现这一目标 - 因为它很长而且有点啰嗦我只是在概念而不是代码中解释它。

XLSX遵循ISO 29500,如果您想在php中彻底操作文档,则可以公开使用。否则,要意识到xlsx文件是一堆xml文件的压缩档案。

创建一个你想要的模板,比如说它有不同类型样式的交替行,在excel或者某个描述的开放xml编辑器中。确保在那里放置一些数据,并确保某些字段相同(仅用于学习目的)。

然后将文件保存为xlsx,将其重命名为.zip,或在存档提取器中将其打开并观察内容。

首先,请注意[Content_Types] .xml文件,它描述了归档中主要文件的位置以及它自身所遵循的标准以及这些文件的内容类型。

xl/文件夹之外的所有内容都只是元数据。但是观察docProps/core.xml包含作者,修改和时间戳信息 - 当您重新创建此文件时,可以在php中替换它们。此外,指向docProps/core.xml的所有内容都可以根据您的喜好重新命名,[Content_Types].xml不能。{/ p>

好的,所以现在你明白这一点,你就会开始观察在这个地方抛出的ids。他们喜欢在文件格式中使用它,所有内容都通过其在特定xml属性列表中的索引或类似内容引用其他所有内容。他们通常还会描述此类列表中的项目数量。

xl/中,您会看到themes.xml, styles.xml, workbook.xml, sharedStrings.xml, _rels/, worksheets/

如果使用样式,样式将会被大量不必要的样式所夸大,这些样式默认情况下会优于构建。但您应该能够看到这些样式的工作方式,以便您可以自定义自己的样式。

对我而言,主题是毫无意义的,所以我将其及其引用的ID全部删除。

接下来,您将看到工作簿,这是包含有关电子表格文档内部工作表信息的文件,因为显然可以有多个工作簿。它还包含一些表格元数据,例如其大小等。

现在是你遇到的第一个大华。 sharedStrings.xml是一个奇怪的文件,它存储将插入到静态电子表格中的单元格中的所有信息。它们被编入索引,但读取文档的引擎会计算出它们的索引。重复的任何内容都可以返回到工作表本身(工作表文件夹内部)中的旧索引,以便在具有重复值的大型文档中保存文件大小。 不是count元素中的属性uniquecountsst以及它们显然意味着什么。

这是php中的一个阶段,您可以在其中填充包含工作表中所需内容的数据,并将其转储到xml格式的列表中,例如此文件出现。另请注意,这些文件不需要在没有换行符或换行符的情况下被卡住,因为有或没有仍然有效的xml,无论如何它们都可以在读者中使用。

查看_rels文件夹,它再次显而易见。

最后是表单本身。这里的字段中的数字是指sharedStrings.xml中字符串的索引位置。属性s是样式,t是字段中的数据类型。 R是单元格的位置,但是为什么它需要的东西超出我的时候才能真正理解它。

在php中生成这个文件也不应该太困难。只需使用您用于制作sharedStrings.xml文件的数据阵列中的索引。

哦,还有工作表中有列宽信息,你可以根据你使用的字体找出它,并在需要的时候自动调整它们的大小。

最后是在php中打包它。

我的代码位于一个类中,该类接收我使用excel创建的数据和特定保存文件,以保持简单。

$this->folder_structure_simple = Array(
    "_rels/.rels" => "_rels__rels",
    "docProps/app.xml" => "docProps_app_xml",
    "docProps/core.xml" => "docProps_core_xml",
    "xl/_rels/workbook.xml.rels",
        "xl/theme/theme1.xml",
        "xl/worksheets/sheet1.xml",
        "xl/sharedStrings.xml",
        "xl/styles.xml",
        "xl/workbook.xml",
    "[Content_Types].xml" => "Content_Types_xml"
);

$zip = new ZipArchive;
$res = $zip->open($this->file_name, ZipArchive::CREATE);
if($res === TRUE){
    foreach($this->folder_structure_simple as $file => $function){
            $zip->addFromString($file, $this->$funtion);
    }
    $zip->close();
    echo 'ok';
}else{
    return FALSE;
}

并且函数会生成所需的数据。非常快,不太灵活。

答案 1 :(得分:3)

你有什么CSV,而不是XLSX文件。 XLSX是一个ZIP包装的XML blob。将您的MIME类型更改为text / csv。

答案 2 :(得分:3)

你拥有的实际上是一个CSV文件。根据您的操作系统,浏览器和Excel版本,浏览器将以不同的方式让您使用Excel软件打开扩展名CSV,XLS XLSX。

如果您确实希望使用Excel打开数据,则可以使用OpenTBS将数据与Excel模板合并。使用当前在Release Candidate中的1.6.0版(或更高版本),因为它为Excel文件带来了主要功能。

在你的标题中有“没有excel库PHP”。我不知道为什么你有这个规范,但OpenTBS并不完全是一个Excel库。它是一个PHP工具,用于使用模板合并OpenOffice和Ms Office文档。