Выгрузка данных в Excel. Создание csv файлов

Зачастую в процессе разработке появляется необходимость выгрузки данных. Одним из самых удобных и читабельных способов является запись данных в таблицу excel. Excel файл может иметь несколько расширений – xls, xlsx, csv и тд. Самым удобным форматом с точки зрения генерации является csv, поскольку он устроен гораздо проще других. В таком файле столбцы таблицы разделяются каким-либо символом, который потом можно указать при открытии файла с помощью MS Office. По умолчанию символом-разделителем является точка с запятой, его и стоит использовать во избежание проблем при дальнейшем чтении файла. А для разделения строк в csv файлах используется перенос строки. Таким образом, получается, что для создания excel файла, достаточно создать текстовый файл, используя в нужных местах необходимые разделители столбцов и строк. Еще одним важным моментом, при генерации csv файлов, является кодировка файла. Для корректного отображения кириллицы следует использовать windows-1251.

Пример:

// массив имитирует данные,  
// полученные, например, из базы данных 
$data = array( 
  array( 
    'строка1 столбец1',  
    'строка1 столбец2',  
    'строка1 столбец3' 
  ), 
  array( 
    'строка2 столбец1',  
    'строка2 столбец2',  
    'строка2 столбец3' 
  ), 
  array( 
    'строка3 столбец1',  
    'строка3 столбец2',  
    'строка3 столбец3'
  ) 
); 
 
// строка, которая будет записана в csv файл 
$str = '';  
// перебираем все данные 
foreach($data as $value){ 
  $str .= 
$value[0].';'.$value[1].';'.$value[2].";\r\n"; 
} 
// задаем кодировку windows-1251 для строки 
$str = iconv("UTF-8", "WINDOWS-1251",  $str); 
// создаем csv файл и записываем в него строку 
file_put_contents('test.csv', $str);


В приведенном примере, использовалась ранее не описанная функция - iconv. Она позволяет преобразовывать текст в нужную кодировку.

Добавлено: 30 Марта 2018 06:25:10 Добавил: Андрей Ковальчук

Разбор Excel таблицы. Получение данных из csv файла

В предыдущем рецепте, был приведен пример выгрузки данных в csv файл. Но бывает, что требуется реализовать обратную операцию – сделать разбор csv файла, считать хранящиеся в нем данные. Получение данных из csv файла можно реализовать несколькими разными способами: получить содержимое файла и разбить его с помощью функции explode. А можно использовать специальную php функцию – fgetcsv, которая читает строку и производит ее разбор. Второй вариант более красивый и корректный, поэтому приведенный ниже пример будет использовать именно этот способ.

Пример:

$row = 1; 
// открываем файл 
$file = fopen("test.csv", "r"); 
82 
 
// разбираем файл построчно 
while (($data = fgetcsv($file, 1000, ";")) !== false){ 
  // количество полей в строке 
  $countPlace = count($data);  
  echo "$countPlace полей в строке $row: <br/>"; 
  // выводим значения  
  for ($c=0; $c < $countPlace; $c++) { 
     echo $data[$c] . "<br/>"; 
  } 
  $row++; 
} 
fclose($file);

Добавлено: 30 Марта 2018 06:20:57 Добавил: Андрей Ковальчук

Работа с zip архивами. Запаковка файлов

Иногда бывает необходимо программно запаковать файлы в zip архив. Для этих целей отлично подходит модуль - ZipArchive, который практически на всех серверах установлен вместе с самим php. Если же данный модуль не установлен, то следует это сделать. Для работы с модулем в php имеется класс – ZipArchive. Именно он и будет использован в рецепте, показывающем как можно запаковать все файлы и подпапки внутри выбранной папки.

Пример:

// путь к папке, файлы которой будем архивировать 
$pathdir='test/';  
//название архива 
$nameArhive = 'test.zip';  
// класс для работы с архивами 
$zip = new ZipArchive;  
// создаем архив, если все прошло удачно продолжаем 
if ( 
$zip->open($nameArhive, ZipArchive::CREATE) === true 
){  
  // открываем папку с файлами 
  $dir = opendir($pathdir);  
    // перебираем все файлы из нашей папки 
    while($file = readdir($dir)){  
    // проверяем файл ли мы взяли из папки 
    if (is_file($pathdir.$file)){  
      // архивируем 
      $zip->addFile($pathdir.$file, $file);  
      // выводим название  
// заархивированного файла 
      echo "Заархивирован: "  
. $pathdir . $file . '<br/>';  
    } 
    } 
    $zip->close(); // закрываем архив. 
    echo 'Архив успешно создан'; 
}else{ 
    die ('Произошла ошибка при создании архива'); 
}

Добавлено: 30 Марта 2018 06:18:48 Добавил: Андрей Ковальчук

Работа с zip архивами. Распаковка файлов

В предыдущем рецепте, был приведён пример запаковки файлов в архив. Теперь будет приведен способ распаковки zip архивов. Как и при запаковке, в коде использован модуль и класс ZipArchive.
Пример:

// путь к папке, в которую будет распакован архив 
$pathdir = 'test/';  
//название архива 
$nameArhive = 'test.zip';  
// класс для работы с архивами 
$zip = new ZipArchive;  
// открываем архив 
if ($zip->open($nameArhive) === true){  
    // распаковываем архив 
    $zip->extractTo($pathdir);  
    // закрываем архив. 
    $zip->close();  
    echo 'Архив распакован в ' . $pathdir; 
}else{ 
    die ('Произошла ошибка при распаковке архива'); 
}

Добавлено: 30 Марта 2018 06:17:12 Добавил: Андрей Ковальчук

Простое сжатие CSS файлов

Для больших проектов, которые имеют много css файлов большого размера, сжатие файлов стилей может немного ускорить загрузку страниц. Почти в каждом css файле можно найти куски закомментированного кода, повторы пробелов, табуляцию — все это можно удалить из файлов, а так же можно избавиться от переходов на новую строку. Помимо удаления лишних символов, будет полезно собрать все файлы в один файл, это тоже ускоряет загрузку. Все эти действия наглядно продемонстрирует ниже приведенный рецепт.
Пример:

// массив с путями до css файлов 
$css_array = array( 
    'css/style_1.css', 
    'css/style_2.css' 
); 
// путь, куда будет сохранен сжатый файл 
$new_file = "css/compression_file.css"; 
// вызываем функцию сжатия 
$result = compression_files($css_array, $new_file); 
var_dump($result); // вывод результата 
 
/** 
*   Функция для сжатия CSS файлов 
*   Удаляет комментарии, табуляцию,  
*   переходы на новую строку и повторяющиеся пробелы 
*   А также собирает все файлы в один 
* 
*   @var $files_css array  - массив путей 
*   до css файлов, которые необходимо сжать 
* 
*   @var $new_file  string - путь, куда будет  
*   сохранен сжатый файл 
*
 
*   @return bool - результат 
*/ 
function compression_files($files_css, $new_file) { 
    // получаем содержимое всех css файлов 
    $content_css = ""; 
    foreach($files_css as $one_file){ 
    $content_css .= @file_get_contents($one_file); 
    // если какой-то из файлов  
// не получилось прочитать 
    if(!$content_css) return false;  
    }   
    // удаляем комментарии  
    $content_css = preg_replace( 
'!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', 
$content_css 
    ); 
    // удаляем табуляции и переходы на новую строку 
    $content_css = str_replace( 
    array("\r\n", "\r", "\n", "\t"), ' ', 
$content_css 
    ); 
    // удаляем повторяющиеся пробелы 
    $content_css = preg_replace( 
'/ {2,}/', ' ', $content_css 
  );      
    // сохраняем результат в файл 
    $css_file = fopen ($new_file, "w+");   
    fwrite($css_file, $content_css);   
    $result_save = fclose($css_file);       
    // вернем результат сохранения 
    return $result_save; 
}

Добавлено: 30 Марта 2018 06:15:36 Добавил: Андрей Ковальчук

Создание папки

Для создания папки можно воспользоваться функцией mkdir. При создании, можно сразу задать права доступа на директорию. Только хочу обратить внимание, что заданные таким образом права будут работать, только в операционных системах *nix, а в windows такие права будут проигнорированы.

Пример:

// создать папку 
// путь и имя новой папки 
$folder = '/new_folder';  
// создание папки, где 0700 - права 
$result = mkdir ($folder, 0700);  
if($result){ 
  echo "Папка создана";    
}else{ 
  echo "Папка НЕ создана"; 
} 

Добавлено: 30 Марта 2018 06:13:39 Добавил: Андрей Ковальчук

Удаления папки

Удаление папки осуществляется с помощью функции rmdir. Для успешного выполнения этой функции необходимо, чтобы папка была пуста. Таким образом, получается, что для удаления папки сначала необходимо ее очистить.
Пример удаления пустой папки, тут все просто:

// удалить папку 
$folder = '/new_folder'; // путь до папки 
rmdir($path . $folder);  // удаление папки

Для удаления папки, содержащей файлы, необходимо немного больше кода. Как уже выше говорилось, сначала необходимо удалить все файлы и все подпапки, которые содержаться внутри удаляемой папки. Для того, чтобы очистить папки можно написать небольшую рекурсивную функцию. Которая будет перебирать все вложенные файлы и удалять. Если же функция встретит не файл, а папку, то должна будет зайти вовнутрь и уже там удалить все файлы, после чего удалить эту подпапку.
Пример:
// удаление папки со всеми  
// вложенными файлами и подпапками 
 
$folder = '/new_folder'; // имя новой папки 
remove_folder($folder); // удаление 
 
// рекурсивная функция 
function remove_folder($folder) { 
  // получаем все файлы из папки 
  if ($files = glob($folder . "/*")) { 
    // удаляем по одному 
    foreach($files as $file) { 
      if(is_dir($file)){ 
        // если попалась папка,  
// то удаляем ее 
        remove_folder($file);  
      }else{ 
        // если попался файл 
        unlink($file); 
      } 
    } 
  } 
  // удаляем пустую папку 
  rmdir($folder); 
}  

Добавлено: 29 Марта 2018 22:43:36 Добавил: Андрей Ковальчук

Установка прав на папку

Как уже раньше говорилось, установить права на папку можно, сразу при ее создании. Но не всегда работать приходится с вновь созданными папками, поэтому следующий рецепт покажет, как можно задать права на ранее созданную папку. Обратите внимание, что данный способ будет проигнорирован операционной системой windows. В примере будет использована функция chmod, она отвечает за установку прав.
Пример:

$folder = '/new folder'; // папка права
chmod($folder, 0777); // установка прав, 0777

Добавлено: 29 Марта 2018 22:39:07 Добавил: Андрей Ковальчук

Получение размера папки

Еще одним не маловажным рецептом для работы с папками является получение размера папки, со всеми вложенными файлами и подпапками. Для реализации данного примера, хорошо подходит возможность создания рекурсивных функций. При вызове такой функции происходит проверка всех вложенных файлов – определяется их размер. В случае, когда попадается вложенная папка – подпапка, осуществляется рекурсивный вызов функции, которая перебирает файлы уже во вложенной подпапке.
Пример:

// указываем путь до папки или файла  
$dirname = '/folder/';  
// заносим в переменную размер папки или файла 
$size = dir_size($dirname);  
echo $formSize; 
 
// функция для просмотра всех подпапок  
// и всех вложенных файлов 
function dir_size($dirname) { 
  $totalsize = 0; // общий размер 
  // открываем папку 
  if ($dirstream = @opendir($dirname)) { 
    // перебираем все что находится внутри папки 
    while(($filename = readdir($dirstream))!==false){ 
      if ($filename != "." && $filename != ".."){ 
    // если попался файл 
    if (is_file($dirname . "/" . $filename)){ 
      $totalsize += filesize( 
$dirname . "/" . $filename 
  ); 
    }
 
    // если попалась папка 
    if(is_dir($dirname . "/" . $filename)){ 
      $totalsize += dir_size( 
$dirname . "/" . $filename 
); 
    } 
     } 
   } 
  } 
  // закрываем папку 
  closedir($dirstream); 
  // возвращаем результат 
  return $totalsize; 
}

В результате выполнения приведенного выше скрипта, мы получим размер папки в байтах. Чтобы сделать красивый, форматированный вывод размера – перевести в Кб, Мб и тд, можно воспользоваться функцией, которая была описана в рецепте «Размер файла. Перевод байт в КБ, Мб и тд».

Добавлено: 29 Марта 2018 22:37:25 Добавил: Андрей Ковальчук

Массовая замена текста в файлах

Этот рецепт может быть полезен, при работе с большим количеством текстовых файлов. Пример наглядно покажет, как можно перебрать все файлы, находящиеся в заданной папке, а также во всех вложенных папках. Так же рецепт хорошо демонстрирует работу рекурсивных функций.
Пример:

// пример использования 
$oldText = 'old text'; // что меняем 
90 
 
$newText = 'new text'; // на что меняем 
$folderName = "./files"; // в какой папке меняем 
replace_txt($folderName, $oldText, $newText); 
 
 
/** 
* Функция замены текста во всех файлах папки 
*  
* @param string $folderName - пусть до папки 
* @param string $oldText - искомый текст 
* @param string $newText - на что меняем текст 
*/ 
function replace_txt($folderName, $oldText, $newText){ 
  // открываем текущую папку  
  $dir = opendir($folderName);  
  // перебираем папку  
  // перебираем пока есть файлы 
  while (($file = readdir($dir)) !== false){  
    // если это не папка 
    if($file != "." && $file != ".."){  
      // если файл 
      if(is_file($folderName."/".$file)){  
    // открываем файл 
    $contentFile = file_get_contents(  
      $folderName."/".$file 
);  
    // для работы с файлами в  
// кодировке windows-1251 
    //$contentFile = iconv( 
//  "windows-1251", "utf-8", $contentFile 
//);  
    // делаем замену в тексте 
    $contentFile = str_replace( 
$oldText, $newText, $contentFile 
);  
// сохраняем изменения          
file_put_contents( 
      $folderName."/".$file,$contentFile 
);  
      }  
      // если папка, то рекурсивно  
    // вызываем replace_txt 
      if(is_dir($folderName."/".$file)){   
 
        replace_txt( 
  $folderName."/".$file, $oldText, $newText 
            ); 
      } 
    }  
  }  
  // закрываем папку 
  closedir($dir); 

Добавлено: 29 Марта 2018 22:35:47 Добавил: Андрей Ковальчук

Поиск файла в папке

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

// пример использования 
$folderName = "./files"; // в какой папке ищем 
$fileName = "test.txt"; // что ищем 
$result = search_file($folderName, $fileName); 
if($result){ 
    echo $result; 
}else{ 
    echo "Нет такого файла"; 
} 
 
/** 
* Поиск файла по имени во всех папках и подпапках 
*  
* @param string $folderName - пусть до папки 
* @param string $fileName - искомый файл 
*/ 
function search_file($folderName, $fileName){ 
  // открываем текущую папку  
  $dir = opendir($folderName);  
  // перебираем папку  
 
  // перебираем пока есть файлы 
  while (($file = readdir($dir)) !== false){  
    if($file != "." && $file != ".."){  
      // если файл проверяем имя 
      if(is_file($folderName . "/" . $file)){  
    // если имя файла искомое,  
// то вернем путь до него 
    if($file == $fileName)  
      return $folderName."/".$file; 
      }  
      // если папка, то рекурсивно  
          // вызываем search_file 
      if(is_dir($folderName . "/" . $file)){ 
    return search_file($folderName . "/" . $file, 
    $fileName); 
      } 
    }  
  } 
  // закрываем папку 
  closedir($dir); 
}

Добавлено: 29 Марта 2018 19:55:15 Добавил: Андрей Ковальчук