2011-05-19 142 views
6

這就是我現在使用的。如何在不使用任何Excel庫的情況下創建xlsx文件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無法打開文件「文件名」 因爲文件格式或文件 擴展名無效。驗證 文件格式是否已損壞 ,並且文件擴展名匹配 該文件的格式。

什麼標題應發送到服務器?或者我如何生成該文件?

回答

3

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

如果您確實希望使用Excel打開數據,則可以使用OpenTBS將數據與Excel模板合併。使用版本1.6.0(或更高版本),它目前在發佈候選版本中,因爲它爲Excel文件帶來了主要的功能。

在您的標題中有「沒有excel庫PHP」。我不知道爲什麼你有這個規範,但OpenTBS不完全是一個Excel庫。這是一個使用模板合併OpenOffice和Ms Office文檔的PHP工具。

+0

'OpenTBS不完全是一個Excel庫'。那麼,從tinybutstrong.com索引頁: 'TinyButStrong是一個**庫**,使您可以動態創建XML/HTML頁面...' – Pere 2014-12-24 10:52:02

3

你有一個CSV,而不是一個XLSX文件。 XLSX是一個ZIP壓縮的XML塊。將您的MIME類型更改爲text/csv。

+0

...或TSV,更正確。 +1不管。 :) – deceze 2011-05-19 07:55:22

+0

不要將我重定向到'CSV'。這種格式與'xls'一起工作,但不能與'xlsx'一起工作。我不想'CSV' – Daric 2011-05-19 07:59:11

+7

那麼你爲什麼要構建一個CSV? :)XSLX格式非常複雜,但如果你想這樣做,你應該可以谷歌的XLSX規範,這是可用的(雖然目前的MS實施)。你可以從這裏開始:http://openxmldeveloper.org/articles/GuidedTourOfSpecPart1.aspx。不過,這是你的葬禮。這個規範比寫出一個CSV要複雜得多(比如你上面描述的那個)。不要因爲回答你的離題問題而冷落我。 :) – 2011-05-19 08:04:58

14

我以一種快速的方式來達到這個目的 - 因爲它很長而且囉嗦,我只是用概念而不是代碼來解釋它。

如果您想在PHP中徹底操作文檔,XLSX將遵循ISO 29500的規定。否則,請認識到xlsx文件是一堆xml文件的壓縮文件。

製作一個你想要的模板,假設它有不同類型的風格交替排列的行,在excel中或者在某些描述中打開xml編輯器。確保你在那裏放置了一些數據,並確保一些字段是平等的(僅用於學習目的)。

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

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

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

好吧,所以現在你明白了這一點,你會開始觀察在這個地方拋出的ID。他們喜歡以文件格式使用它,所有內容都通過索引在特定的xml屬性列表或類似內容中引用其他所有內容。他們通常也會描述這些清單中的項目數量。您可以看到themes.xml, styles.xml, workbook.xml, sharedStrings.xml, _rels/, worksheets/

如果您使用了樣式,那麼樣式將會被大量不必要的樣式誇大,默認情況下將生成默認樣式。但是你應該能夠看到這些風格是如何工作的,以便你可以定製你自己的風格。

給我的主題是毫無意義的,所以我在整個過程中刪除它和它的引用ID。

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

現在出現您將遇到的第一個大華。 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; 
} 

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

+3

優秀的答案,這是一個很好的描述如何創建或定製您的在PHP中擁有XLSX文件。我不確定爲什麼你會稱它爲「詭計」 - 儘管如此,這非常整齊。 – zmippie 2014-05-20 08:38:55

+0

我之所以這麼稱呼是因爲我基本上避免從ISO 29.5k中讀取任何東西:P – Supernovah 2014-06-11 12:07:12

+0

非常好,腳踏實地的描述,官方文檔太壓倒,也沒有提供實用的PHP實現。關於檔案結構(XLSX文件),這是我發現的最好的概述,既簡潔又完整,並附有一些有用的截圖:http://officeopenxml.com/anatomyofOOXML-xlsx.php – kasimir 2017-09-06 06:39:59

相關問題