2015-02-23 45 views
4

我使用此代碼由克拉西米爾輸出數據從PHP爲.xls保存塊從數據庫到XLS

function xlsBOF() { 
    echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); 
} 
function xlsEOF() { 
    echo pack("ss", 0x0A, 0x00); 
} 
function xlsWriteNumber($Row, $Col, $Value) { 
    echo pack("sssss", 0x203, 14, $Row, $Col, 0x0); 
    echo pack("d", $Value); 
} 
function xlsWriteLabel($Row, $Col, $Value) { 
    $L = strlen($Value); 
    echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); 
    echo $Value; 
} 
// prepare headers information 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment; filename=\"export_".date("Y-m-d").".xls\""); 
header("Content-Transfer-Encoding: binary"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
// start exporting 
xlsBOF(); 
// first row 
xlsWriteLabel(0, 0, "id"); 
xlsWriteLabel(0, 1, "name"); 
xlsWriteLabel(0, 2, "email"); 
// second row 
xlsWriteNumber(1, 0, 230); 
xlsWriteLabel(1, 1, "John"); 
xlsWriteLabel(1, 2, "[email protected]"); 
// third row 
xlsWriteNumber(2, 0, 350); 
xlsWriteLabel(2, 1, "Mark"); 
xlsWriteLabel(2, 2, "[email protected]"); 
// end exporting 
xlsEOF(); 

它工作正常的數據量小,但是當我從數據庫導出,例如,大量的數據(100.000條記錄),我得到服務器超時錯誤。

如何更改此代碼,以便我可以逐步將小塊數據寫入文件?

目前我使用的是隻爲製表符分隔的文件或CSV的

我寫1000行大塊的.xls文件奏效的方法。導出一個塊後,我使用window.location.href=the_script.php?offset=new_offset爲下一個偏移量調用腳本,並再次打開文件並追加下一行1000行。

此方法的問題是Excel輸出警告文件格式和擴展名不匹配。該文件可能已損壞或不安全。除非您信任來源,否則不要打開它。你還想打開嗎?

我怎樣才能達到上述腳本類似的東西?

+0

無論如何,您將會遇到100,000條記錄問題,因爲xls文件只允許在工作表中記錄65,536條記錄....如果您需要處理大量數據,請使用CSV ....但請確保文件擴展名爲.csv,以避免MS Excel在打開文件時向您發出警告 – 2015-02-23 09:27:25

回答

1
+0

這將是一個臨時解決方案,但隨着要導出的數據量增加,時間限制也會增加,因此我必須繼續隨着數據庫的增長而增加。另外據我所知,一個大的時間限制是一個漏洞 – 2015-02-23 09:32:43

+0

的確如此,但是對這個導出功能的訪問可以很容易地限制到特定的用戶或IP範圍......這對開放公衆來說並不需要。 – Seb 2015-02-23 09:41:14

+0

這甚至不是一個有效的解決方案.....你不能將超過65,536條記錄導出到BIFF格式的.xls文件,除非你將它們分成多個工作表.....這是MS Excel的限制和BIFF格式 – 2015-02-23 10:02:37