Багато, працюючи з PHP і MySQL, стикалися з проблемою експорту / імпорту даних в CSV файл, зрозумілий для Excel. Функції fputcsv () і fgetcsv () працюють не так, як нам хотілося б. І відкриваючи отриманий CSV-файл в Ексель ми бачимо половину рядка в одній комірці, а іншу частину рядка в другій. Іноді такі помилки інтерпретації даних Ексель пов'язані з його обмеженням кількості даних в одній комірці - 50 000 символів. якщо більше, то що залишилися дані відображаються в новому рядку.
Опис формату CSV для Excel
Програма Microsoft Excel розуміє CSV-файли як розділені осередки, розділені символом крапка з комою (;), а рядок закінчується символом переведення рядка. Якщо ж в самій комірці містяться символи крапка з комою (;) або переходу на новий рядок, то такий осередок обрамляється символом лапок ( ").
Наприклад.
ячейка1; "Ячейка2 з символом; або в кілька рядків"; ячейка3;
Якщо ж в самій комірці зустрічаються лапки ( "), то вони подвоюються.
Наприклад.
Це "лапки; => Це" "лапки;
Що робить стандартна функція експорту в CSV в PHP
Функція fputcsv ($ csv_file. $ Array, $ delimiter = ',', $ enclosure = ' "') виконує експорт масиву $ array в файл $ csv_file. При цьому в якості роздільника за замовчуванням використовуючи кому ($ delimiter = ',') , а в якості обрамляє символу - лапки ($ enclosure = ' "').
Здавалося б, щоб записати дані в формат CSV для MS Excel потрібно всього лише встановити $ delimiter = ';', а $ enclosure залишити рівним лапок ( "), але в реальності трапляються помилки інтерпретації файлу Ексель.
Ось у чому підступ: функція fputcsv як екрануючого символу - зворотний слеш (\). І це змінити ніяк не можна. Тобто, якщо ви будете писати дані види Лала \ "лала, то при записі в файл цей символ лапок не подвоїться, тому що він екранований зворотним слешем, а значить, Ексель вважатиме його кордоном осередки, хоча це не так.
Вихід. використовувати свою функцію експорту в CSV, далі буде наведено її текст.
Що робить стандартна функція імпорту в CSV в PHP
У PHP функція імпорту з CSV-фала fgetcsv ($ csv_file, $ length = 0, $ delimiter = ',', $ enclosure = ' "', $ escape = '\\') імпортує з CSV-файлу $ csv_file рядок максимальної довжини $ length, якщо = 0, значить, вона може бути будь-хто. За замовчуванням як роздільник використовує символ коми (,), як обрамляє символу - лапки ( "), і символ екранування - зворотний слеш (\).
Починаючи з PHP версії 5.3 символ екранування в цій функції можна задавати свій.
Щоб експортувати дані з допомогою PHP в формат CSV для Ексель, досить до всього іншого в якості екрануючого символу встановити лапки. Тобто $ delimiter = ';', $ enclosure = ' "', $ escape = '"'.
Підсумкові функції роботи з CSV
Як відкрити Ексель CSV-файл в кодуванні UTF-8
Щоб Excel нормально відкривав CSV-файли в кодуванні UTF-8 не достатньо просто записувати туди дані цьому кодуванні. Щоб "підказати" Ексель використовувати юнікод прийнято в початок файлу вставляти 3х байтную послідовність: EF BB BF. Це не є офіційне рішення, це просто особливість відкриття Ексель CSV-файлів.
Для наочності наведемо шматок коду для PHP:
Далі вже експортуємо дані в кодуванні UTF-8 за допомогою функції my_fputcsv (). Excel відмінно відкриває такі файли.
Важливо! Незважаючи на те, що файл відкриється в кдіровке utf-8, Excel його збереже все одно в кодуванні windows-1251.