簡體   English   中英

如何在不使用任何excel庫PHP的情況下創建xlsx文件

[英]How to create xlsx file without using any excel library PHP

這是我正在使用的。

$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無法打開文件“文件名”,因為文件格式或文件擴展名無效。 驗證文件格式是否已損壞,以及文件擴展名是否與文件格式匹配。

應該向服務器發送什么標頭? 或者我如何生成該文件?

我以一種快速,有點小氣的方式實現這一點 - 因為它很長而且有點啰嗦我只是在概念而不是代碼中解釋它。

XLSX遵循ISO 29500,如果您想在php中徹底操作文檔,則可以公開使用。 否則,要意識到xlsx文件是一堆xml文件的壓縮檔案。

制作一個你想要的模板,比如它有不同類型樣式的交替行,在excel或者某個描述的開放xml編輯器中。 確保在那里放置一些數據,並確保某些字段相同(僅用於學習目的)。

然后將文件保存為xlsx,將其重命名為.zip,或在存檔提取器中將其打開並觀察內容。

首先,請注意[Content_Types] .xml文件,它描述了歸檔中主要文件的位置以及它自身所遵循的標准以及這些文件的內容類型。

xl/文件夾之外的所有內容都只是元數據。 但是觀察docProps/core.xml包含作者,修改和時間戳信息 - 當您重新創建此文件時,可以在php中替換它們。 此外,指向的所有內容, docProps/core.xml都可以根據您的喜好重命名, [Content_Types].xml不能。

好的,所以現在你明白了,你會開始觀察在這個地方拋出的ids。 他們喜歡在文件格式中使用它,所有內容都通過其在特定xml屬性列表中的索引或類似內容引用其他所有內容。 他們通常還會描述此類列表中的項目數量。

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

如果您使用樣式,那么樣式將會被大量不必要的樣式所誇大,這些樣式默認情況下會優於構建。 但是您應該能夠看到這些樣式如何工作,以便您可以自定義。

對我而言,主題是毫無意義的,因此我將其及其引用的ID全部刪除。

接下來,您將看到工作簿,這是包含有關電子表格文檔內部工作表信息的文件,因為顯然可以有多個工作簿。 它還包含一些表格元數據,例如其大小等。

現在是你遇到的第一個大華。 sharedStrings.xml是一個奇怪的文件,它存儲將插入到靜態電子表格中的單元格中的所有信息。 它們被編入索引,但讀取文檔的引擎會計算出它們的索引。 重復的任何內容都可以返回到工作表本身(工作表文件夾內部)中的舊索引,以便在具有重復值的大型文檔中保存文件大小。 不是sst元素中的屬性countuniquecount以及它們顯然意味着什么。

這是php中的一個階段,您可以在其中填充包含表單中所需內容的數據,並將其轉儲到xml格式的列表中,例如此文件出現。 另請注意,這些文件不需要在沒有換行符或換行符的情況下被卡住,因為有或沒有仍然有效的xml,無論如何它們都可以在讀者中使用。

查看_rels文件夾,它再次顯而易見。

最后是表單本身。 這里的字段中的數字是指sharedStrings.xml中字符串的索引位置。 屬性s是樣式,t是字段中的數據類型。 R是單元格的位置,但為什么它需要的東西超出我的時候才能真正理解它。

在php中生成這個文件也不應該太困難。 只需使用您用於制作sharedStrings.xml文件的數據數組中的索引。

哦,還有工作表中有列寬信息,您可以根據您使用的字體找出它,並在需要時自動在PHP中調整它們的大小。

最后是它在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;
}

並且函數產生所需的數據。 非常快,不是很靈活。

你有什么CSV,而不是XLSX文件。 XLSX是一個ZIP包裝的XML blob。 將您的MIME類型更改為text / csv。

你擁有的實際上是一個CSV文件。 根據您的操作系統,瀏覽器和Excel版本,瀏覽器將以不同的方式讓您使用Excel軟件打開擴展名CSV,XLS XLSX。

如果您確實希望使用Excel打開數據,則可以使用OpenTBS將數據與Excel模板合並 使用當前位於Release Candidate中的1.6.0版(或更高版本),因為它為Excel文件帶來了主要功能。

在你的標題中有“沒有excel庫PHP”。 我不知道為什么你有這個規范,但OpenTBS並不完全是一個Excel庫。 它是一個PHP工具,用於使用模板合並OpenOffice和Ms Office文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM