Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Проблема / непонятки с построением ексель файлы при записи данных в него.
Сохраняю данные сразу в файл, который имеет расширение 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)
Не в сети
У вас смешалось все в кучу.
Во-первых, вы пишете данные в формате .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);
Не в сети
Страницы 1