PHP функция для формирования CSV
Сегодня появилась задача, выводить CSV без сохранения в файл, т.е. на генерируем на backend-е и отправляем в браузер, а пользователю выскакивает окошко с предложением сохранить файл..
Сама задача очень простая, за исключением того что в PHP нет стандартных средств для упаковки массива в CSV строку (или есть, но я о них еще не узнал). Чтобы не изобретать велосипед я погугли немного и нашел кастомную функцию, которая эмулировала fputcsv, убрав запись в файл получил такой метод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
function getCSVLine($fields = array(), $delimiter = ',', $enclosure = '"') { $str = ''; $escape_char = '\\'; foreach ($fields as $value) { if (strpos($value, $delimiter) !== false || strpos($value, $enclosure) !== false || strpos($value, "\n") !== false || strpos($value, "\r") !== false || strpos($value, "\t") !== false || strpos($value, ' ') !== false) { $str2 = $enclosure; $escaped = 0; $len = strlen($value); for ($i=0;$i<$len;$i++) { if ($value[$i] == $escape_char) { $escaped = 1; } else if (!$escaped && $value[$i] == $enclosure) { $str2 .= $enclosure; } else { $escaped = 0; } $str2 .= $value[$i]; } $str2 .= $enclosure; $str .= $str2.$delimiter; } else { $str .= $value.$delimiter; } } $str = substr($str,0,-1); $str .= "\n"; return $str; } |
Дальше все было просто, сформировал массив записей и вывел пользователю. Не буду сюда писать весь код, напишу маленький пример использования:
1 2 3 4 5 |
echo getCSVLine(array('Column 1', 'Column 2')); echo getCSVLine(array('Cell 11', 'Cell 12')); echo getCSVLine(array('Cell 21', 'Cell 22')); |
Пожалуй это и всё.. Хотя нет!
Для того чтобы файл не просто выводился на экран, а выводилось диалоговое окно о сохранении, файл нужно изменить пример так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1. header('Pragma: no-cache'); // HTTP 1.0. header('Expires: 0'); // Proxies. header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-Disposition: attachment; filename="devices.csv"'); echo getCSVLine(array('Column 1', 'Column 2')); echo getCSVLine(array('Cell 11', 'Cell 12')); echo getCSVLine(array('Cell 21', 'Cell 22')); |
Теперь все!
Author: | Tags: /
| Rating:
Leave a Reply