Добавить заголовок в csv с помощью fputcsv php

Я пытаюсь ввести некоторые данные в файл csv, и он работает хорошо, но если я попытаюсь добавить заголовок таблицы данных, Excel не позволит мне открыть файл, потому что «формат файла и расширение файла. csv не совпадают. Возможно, файл поврежден или небезопасен".

Вот код:

//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;Имя;Ref;Количество

2;"Блуза - Цвет: белый, размер: M";demo_2;6

3;"Платье с принтом — Цвет: оранжевый, размер: S";demo_3;4


person Sefean    schedule 03.08.2017    source источник
comment
То, как вы используете одинарные и двойные кавычки, ранит меня мысленно. Вы должны использовать одинарные кавычки для всего, что не требует интерполяции, и двойные кавычки для всего, что делает. По сути, все ваши двойные кавычки должны быть одинарными в вашем коде.   -  person GrumpyCrouton    schedule 03.08.2017
comment
Можете ли вы открыть свой CSV-файл в текстовом редакторе и поделиться его содержимым с нами? Возможно, достаточно первых 3-4 строк.   -  person GrumpyCrouton    schedule 03.08.2017
comment
Да, я знаю, у меня изначально были одинарные кавычки, я изменил одинарные кавычки на двойные, просто чтобы проверить, заставит ли это работать по какой-то причине, но это не сработало. Забыл поменять обратно.   -  person Sefean    schedule 03.08.2017
comment
@GrumpyCrouton Готово   -  person Sefean    schedule 03.08.2017


Ответы (3)


Если вы собираетесь использовать это для создания CSV-файла, который можно нормально открыть в Excel, заголовки не нужно заключать в двойные кавычки (поскольку они не содержат символов-разделителей), и вы должны использовать запятые. а не точки с запятой для разделителей. Однако если вы внесете эти изменения, вы по-прежнему будете получать то же сообщение об ошибке при попытке открыть полученный файл в Excel. Удивительно, но это потому что ваши заголовки начинаются с идентификатором.

Если вы можете использовать другое имя для этого первого заголовка столбца, это может немного упростить ситуацию.

$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 без ошибок.

person Don't Panic    schedule 03.08.2017
comment
ВОТ ЭТО ДА! Я никогда не мог себе представить, что это из-за этого, теперь работает отлично, спасибо! - person Sefean; 03.08.2017

Попробуйте изменить заголовки на это:

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

Это заключит строки в двойные кавычки, что должно устранить проблемы с синтаксисом, с которыми вы сталкиваетесь.

person GrumpyCrouton    schedule 03.08.2017
comment
fputcsv добавит дополнительные кавычки из-за кавычек в строках. - person manassehkatz-Moving 2 Codidact; 03.08.2017
comment
Я только что протестировал его на PHP и получил: """ID""","""Name""","""Ref""","""Quantity""" - person manassehkatz-Moving 2 Codidact; 03.08.2017
comment
Спасибо! Это сработало! Он заключил строки в двойные кавычки, как сказал @manassehkatz, но, по крайней мере, я могу получить доступ к файлу. - person Sefean; 03.08.2017
comment
@Sefean Взгляните на мой ответ - в основном, если вы жестко закодируете строку заголовка, вы можете получить ее правильно, плюс запятые вместо точек с запятой сделают работу Excel немного более плавной. Если у вас на самом деле много полей, вернитесь к массиву для заголовка, но создайте свой собственный цикл для его вывода вместо использования функции fputcsv, не совсем совместимой с Excel. - person manassehkatz-Moving 2 Codidact; 03.08.2017

Эксель требователен. PHP по умолчанию использует запятые, что на самом деле то, что вы хотите использовать для Excel. Точки с запятой часто работают, но не используются по умолчанию — помните, CSV означает Comma разделенные значения. Вторая проблема специфична для 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);
person manassehkatz-Moving 2 Codidact    schedule 03.08.2017
comment
Я попробовал это, и это не сработало, он поместил заголовки только в 1 ячейку для Excel, что-то вроде этого: (каждый столбец разделен знаком «-») ID; Имя; Ссылка; Количество 2 - NameWhatever - demo_1 - 2 3 - ИмяЧто угодно - demo_1 - 2 - person Sefean; 03.08.2017
comment
Вы также изменили данные fputcsv, чтобы использовать запятые (по умолчанию) вместо точек с запятой? Если вы этого не сделаете, Excel запутается, хотя, когда я попробовал это таким образом, я получил заголовки в порядке, а данные - по одной ячейке в строке. - person manassehkatz-Moving 2 Codidact; 03.08.2017
comment
Да, изменив все на запятые, он будет писать только в первом столбце, потому что Excel хочет использовать точки с запятой вместо запятых. - person Sefean; 03.08.2017
comment
@Sefean Какую версию Excel вы используете? - person manassehkatz-Moving 2 Codidact; 03.08.2017
comment
Я использую Эксель 2016 - person Sefean; 03.08.2017