X

PHP функция для формирования CSV

Сегодня появилась задача, выводить CSV без сохранения в файл, т.е. на генерируем на backend-е и отправляем в браузер, а пользователю выскакивает окошко с предложением сохранить файл..

Сама задача очень простая, за исключением того что в PHP нет стандартных средств для упаковки массива в CSV строку (или есть, но я о них еще не узнал). Чтобы не изобретать велосипед я погугли немного и нашел кастомную функцию, которая эмулировала fputcsv, убрав запись в файл получил такой метод:

    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;
    }

 

Дальше все было просто, сформировал массив записей и вывел пользователю. Не буду сюда писать весь код, напишу маленький пример использования:

echo getCSVLine(array('Column 1', 'Column 2'));
echo getCSVLine(array('Cell 11', 'Cell 12'));
echo getCSVLine(array('Cell 21', 'Cell 22'));

Пожалуй это и всё.. Хотя нет!

Для того чтобы файл не просто выводился на экран, а выводилось диалоговое окно о сохранении, файл нужно изменить пример так:

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'));

Теперь все!

Категории: PHP
Тэги: csv