Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 30.10.2019 10:54:08

Запись строчек в файл с расширением .xls

Здравствуйте.
Проблема / непонятки с построением ексель файлы при записи данных в него.
Сохраняю данные сразу в файл, который имеет расширение xls и открывается экселем (хотя везде пишут что это проблема и нужны библиотеки специальные. Не суть в общем). Созданный файл открываю на винде, кодировка летит. Ексель открывает с кодировкой CP1251 (через онлайн декодер узнал), поэтому перекодирую под винду и всё открывается нормально.
Самый смак в том, что пытаюсь заполнить два столбика, например - фамилия, имя. Строка строится в цикле так - $text .= $value.'; '.$key.';'."\r\n";
При обычных условиях в одну ячейку пишется и фамилия и имя. Если же добавить при записи в файл - fwrite($files, "\xEF\xBB\xBF"); тогда фамилия пишется в один столбец, имя в другой.
Вопрос, почему так? Почитал про эти символы - это либо пробелы, если в середине текста, либо указатели, что файл в кодировке utf-8.
И если кто то писал данные в ексель, то подскажите как нужно было разделить данные по столбцам.

Для примера код, где фамилия и имя разделены по столбцам и новая запись пишется в новой строке -

        $text = '';
	foreach ($arrayData as $key => $value) {
		$text .= $value.'; '.$key.';'."\r\n";
	}
        $files = fopen($_SERVER['DOCUMENT_ROOT']."/file_text.xls","w+b");
        fwrite($files, "\xEF\xBB\xBF");
	$text = mb_convert_encoding($text,"windows-1251");
	fwrite($files, $text);
	fclose ($files);

Изменено Alexandr5 (30.10.2019 10:55:20)

Не в сети

#2 15.11.2019 15:29:29

Re: Запись строчек в файл с расширением .xls

У вас смешалось все в кучу.

Во-первых, вы пишете данные в формате .csv (comma-separated values), а не .xls или .xlsx (это именно родные Excel-форматы, не CSV). Поэтому давайте имени файла расширение .csv.

Во-вторых, Excel (по крайней мере старые версии точно, старее 2015 или около того) читает CSV только в кодировке ОС, т.е. на русской Windows это CP1251 (как вы правильно заметили). Но! У CP1251 не может быть префикса BOM (EF BB BF) - это признак файла в кодировке UTF-8. Нельзя один файл кодировать одновременно как UTF-8 и CP1251. BOM в вашем случае нужно убрать, оставить только mb_convert_encoding().

Наконец, при записи данных полезно их оборачивать в кавычки, чтобы в результате было не имя;фамилия, а "имя";"фамилия" - это защитит их, если в значении будут спецсимволы. Хотя в вашем случае это точно не главная проблема, а проблема в расширении файла и кодировке.

хотя везде пишут что это проблема и нужны библиотеки специальные

Все правильно, пишут как раз про .xls/.xlsx, которые закрытые бинарные форматы от MS.

$text = '';
foreach ($arrayData as $key => $value) {
    $text .= "\"$value\";\"$key\"\r\n";   // <<<
}
$files = fopen($_SERVER['DOCUMENT_ROOT']."/file_text.csv","w+b");   // <<<
//fwrite($files, "\xEF\xBB\xBF");  // <<<
$text = mb_convert_encoding($text,"windows-1251");
fwrite($files, $text);
fclose ($files);

Не в сети

Подвал раздела