Как я могу вывести UTF-8 CSV на PHP, который Excel будет читать правильно? - PullRequest
174 голосов
/ 03 декабря 2010

У меня есть очень простая вещь, которая просто выводит некоторые вещи в формате CSV, но это должен быть UTF-8. Я открываю этот файл в TextEdit или TextMate или Dreamweaver, и он правильно отображает символы UTF-8, но если я открываю его в Excel, он делает это глупо - вместо этого. Вот что у меня во главе моего документа:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Кажется, что все это имеет желаемый эффект, за исключением того, что Excel (Mac, 2008) не хочет импортировать его должным образом. В Excel нет вариантов «открыть как UTF-8» или что-то в этом роде, так что ... я немного раздражаюсь.

Кажется, я нигде не могу найти чёткого решения, несмотря на то, что у многих людей такая же проблема. Больше всего я вижу включение спецификации, но я не могу точно понять, как это сделать. Как вы можете видеть выше, я просто echo пользуюсь этими данными, я не пишу никаких файлов. Я могу сделать это, если мне нужно, просто нет, потому что на данный момент в этом нет необходимости. Любая помощь?

Обновление: я попытался повторить спецификацию как echo pack("CCC", 0xef, 0xbb, 0xbf);, которую я только что извлек с сайта, который пытался обнаружить спецификацию. Но Excel просто добавляет эти три символа в самую первую ячейку при импорте и все еще портит специальные символы.

Ответы [ 30 ]

1 голос
/ 19 июля 2016

Я на Mac, в моем случае мне просто нужно было указать разделитель с помощью "sep=;\n" и кодировать файл в UTF-16LE следующим образом:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');
0 голосов
/ 03 декабря 2010

У меня была такая же проблема, когда у меня была подпрограмма Excel VBA, которая импортировала данные. Поскольку CSV представляет собой простой текстовый формат, я работал над этим, программно открывая данные в простом файловом редакторе, таком как WordPad, и повторно сохраняя их в виде текста в формате Unicode, или копируя их в буфер обмена и вставляя их в Excel. Если Excel автоматически не анализирует CSV в ячейки, это легко исправить с помощью встроенной функции «Текст в столбцы».

0 голосов
/ 30 апреля 2013

Это сообщение довольно старое, но после нескольких часов попыток я хочу поделиться своим решением ... возможно, оно поможет кому-то, имеющему дело с Excel, Mac и CSV, и наткнется на эту угрозу.Я генерирую CSV динамически, как вывод из базы данных с учетом пользователей Excel.(UTF-8 с спецификацией)

Я пробовал много иконок, но не смог заставить работать немецкие умлауты в Mac Excel 2004. Одно из решений: PHPExcel.Это здорово, но для моего проекта это слишком много.Для меня работает создание файла csv и преобразование этого файла csv в xls с помощью этого PHPsnippet: csv2xls .результат xls работает с превосходными немецкими умлаутами (ä, ö, Ü, ...).

0 голосов
/ 17 июля 2013

Я только что попробовал эти заголовки и получил Excel 2013 на ПК с Windows 7, чтобы правильно импортировать файл CSV со специальными символами.Порядок следования байтов (BOM) был последним ключом, который заставил его работать.


    header('Content-Encoding: UTF-8');
    header('Content-type: text/csv; charset=UTF-8');
    header("Content-disposition: attachment; filename=filename.csv");
    header("Pragma: public");
    header("Expires: 0");
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

0 голосов
/ 03 декабря 2010

По-прежнему возникает проблема, когда вы сохраняете его как файл .txt и открываете его в Excel с запятой в качестве разделителя?

Возможно, проблема не в кодировке, а в том, чтофайл не является идеальным CSV в соответствии со стандартами Excel.

0 голосов
/ 09 февраля 2017

# выводит UTF-8 CSV в PHP, который Excel будет читать правильно.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';
0 голосов
/ 27 марта 2016

Я использую это, и это работает

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;
0 голосов
/ 10 апреля 2014

В противном случае вы можете:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);
0 голосов
/ 08 января 2015
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));
0 голосов
/ 11 августа 2015

ЛЕГКО решение для Mac Excel 2008: Я боролся с этим много раз, но вот мое простое решение: Откройте файл .csv в Textwrangler, который должен правильно открыть ваши символы UTF-8. Теперь в нижней строке состояния измените формат файла с «Юникод (UTF-8)» на «Западный (ISO Latin 1)» и сохраните файл. Теперь перейдите в Mac Excel 2008 и выберите «Файл»> «Импорт»> «Выбрать CSV»> «Найти свой файл»> в поле «Источник файла» выберите «Windows (ANSI)» и вуаля символы UTF-8 будут отображаться правильно. По крайней мере, это для меня ...

...