2017-08-03 62 views
1

我想輸入一些數據到一個CSV文件,它很好地工作,但如果我嘗試添加數據表的標題Excel不會讓我打開該文件,因爲「file.csv的文件格式和擴展名不匹配,文件可能損壞或不安全」。使用fputcsv在csv上添加標題php

下面的代碼:

//crate headers 
$headers[] = "ID"; 
$headers[] = "Name"; 
$headers[] = "Ref"; 
$headers[] = "Quantity"; 

// crete and open file 
$csvName = "file.csv"; 
$fileHandle = fopen($csvName, 'w') or die('Can\'t create .csv file, try again later.'); 

//Add the headers, if I take this line out the excel allows me to open the file 
fputcsv($fileHandle,$headers,";"); 

//Add the data 
for($i = 0; $i < count($info); ++$i) { 
    fputcsv($fileHandle,$info[$i],";"); 
} 

//close file 
fclose($fileHandle); 

編輯:

這裏是我的CSV的第一行用記事本打開:

ID,名稱,編號,數量

2; 「女襯衫 - 顏色:白色,尺碼:M」; demo_2; 6

3;「印花連衣裙 - 顏色:橙色,尺碼:S「; demo_3; 4

+2

你使用單引號和雙引號的方式會讓我精神上受傷。對於任何不需要[插入](https://en.wikipedia.org/wiki/String_interpolation)的任何內容,您都應該使用單引號,並且對任何內容使用雙引號。基本上,你所有的雙引號在你的代碼中應該是單引號 – GrumpyCrouton

+0

你能在文本編輯器中打開你的csv文件輸出並與我們分享它的內容嗎?也許只是前3-4行是需要的 – GrumpyCrouton

+0

是的我知道,我原本有單引號,我從單引號更改爲雙引號,只是爲了檢查它是否會因爲某種原因使其工作,但事實並非如此。忘了改回它。 – Sefean

回答

1

如果你打算使用它來創建能正常使用Excel打開CSV文件,標題應該不需要用雙引號(因爲它們不包含任何分隔符),並且您應該使用逗號而不是分號作爲分隔符。但是,如果您進行這些更改,則當您嘗試使用Excel打開生成的文件時,仍然會收到的錯誤消息。令人驚訝的是,這是because your headers start with 'ID'

如果您可以爲第一個列標題使用不同的名稱,它可以簡化一些事情。

$headers = ["ItemID", "Name", "Ref", "Quantity"]; 

$csvName = "file.csv"; 
$fileHandle = fopen($csvName, 'w') or die('Can\'t create .csv file, try again later.'); 

//Add the headers 
fputcsv($fileHandle, $headers); 

//Add the data 
foreach ($info as $item) { 
    fputcsv($fileHandle, $item); 
} 

//close file 
fclose($fileHandle); 

這應該創建一個.csv文件,該文件將在Excel中打開且沒有錯誤。

+0

WOW!我可能從來沒有想到因爲這一點,現在正在完美地工作,謝謝! – Sefean

+1

是啊!很奇怪。巧合的是,這篇博文似乎是由我們的一位主持人禮貌的。 –

1

試圖改變自己的頭到這一點:

$headers[] = '"ID"'; 
$headers[] = '"Name"'; 
$headers[] = '"Ref"'; 
$headers[] = '"Quantity"'; 

這將包裹字符串雙引號,這應該可以解決您所遇到的語法問題。

+0

由於字符串中的引號,fputcsv將添加額外的引號。 – manassehkatz

+0

@manassehkatz他的輸出在字符串周圍沒有引號 – GrumpyCrouton

+0

我剛剛在PHP中進行了測試,並獲得:「」「」ID「」「,」「」Name「」「,」「」Ref「」「,」「」Quantity 「」「'' – manassehkatz

0

Excel很挑剔。 PHP默認使用逗號,這實際上是你想用於Excel的。分號通常會工作,但不是默認值 - 請記住,CSV代表逗號分隔值。第二個問題是特定於Excel。即使它在數據部分中處理不帶引號的字符串,但出於某種原因,它在標題行上效果不佳。我在fputcsv中看不到強制引用的選項,因此您需要對它們進行硬編碼。喜歡的東西:

// create and open file 
$csvName = "file.csv"; 
$fileHandle = fopen($csvName, 'w') or die("Can't create .csv file, try again later."); 

//Add the headers - note that \r\n or \n is OS dependent 
fwrite($fileHandle,'"ID","Name","Ref","Quantity"' . "\r\n"); 

//Add the data 
for ($i = 0; $i < count($info); ++$i) { 
    fputcsv($fileHandle,$info[$i]); 
} 

//close file 
fclose($fileHandle); 
+0

我嘗試這樣做,也沒有工作,它把標題中只有1個細胞FO Excel中,這樣的事情: (分立的每一列「 - 」) ID,名稱,編號,數量 2 - NameWhatever - demo_1 - 2 3 - NameWhatever - demo_1 - 2 – Sefean

+0

您是否還將數據fputcsv更改爲使用逗號(默認)而不是分號?如果你不這樣做,那麼Excel會感到困惑,但是當我嘗試這種方式時,我最終得到了標題OK,並且數據每行都有一個單元格。 – manassehkatz

+0

是的,將所有內容都改爲逗號使其僅寫入第一列,因爲Excel需要分號而不是逗號。 – Sefean