В статье приведены два примера конвертации фалов csv в xlsx, алгоритм следующий:
- Файл открывается с помощью
fopen()
и построчно преобразуем функциейfgetcsv()
в массив, в качестве разделителя обычно используется , - Из полученного массива сформируется xlsx файл с помощью библиотеки PHPExcel.
HTML форма
<form action="" method="post" enctype="multipart/form-data">
<div class="control-group">
<label class="control-label">Файл csv</label>
<div class="controls">
<input type="file" name="file">
</div>
</div>
<button type="submit">Отправить</button>
</form>
Обработчик формы
if (!empty($_FILES['file']['tmp_name'])) {
if (pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION) == 'csv') {
// Чтение файла в массив.
$list = array();
if (($fp = fopen($_FILES['file']['tmp_name'], 'r')) !== false) {
while (($data = fgetcsv($fp, 0, ',')) !== false) {
$list[] = $data;
}
fclose($fp);
}
// Подключение PHPExcel.
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel.php';
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel/Writer/Excel2007.php';
$xls = new PHPExcel();
// В первый лист.
$xls->setActiveSheetIndex(0);
$sheet = $xls->getActiveSheet();
// Формирование XLSX.
$line = 0;
foreach ($list as $line => $item) {
$line++;
foreach ($item as $col => $row) {
$sheet->setCellValueByColumnAndRow($col, $line, $row);
}
}
// Отдача файла в браузер.
$filename = basename($_FILES['file']['name'], '.csv') . '.xlsx';
header('Expires: Mon, 1 Apr 1974 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D,d M YH:i:s') . ' GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=' . $filename);
$objWriter = new PHPExcel_Writer_Excel2007($xls);
$objWriter->save('php://output');
exit;
}
}
$file = __DIR__ . '/list.csv';
// Чтение файла в массив.
$list = array();
if (($fp = fopen($file, 'r')) !== false) {
while (($data = fgetcsv($fp, 0, ',')) !== false) {
$list[] = $data;
}
fclose($fp);
}
// Подключение PHPExcel.
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel.php';
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel/Writer/Excel2007.php';
$xls = new PHPExcel();
// В первый лист.
$xls->setActiveSheetIndex(0);
$sheet = $xls->getActiveSheet();
// Формирование XLSX.
$line = 0;
foreach ($list as $line => $item) {
$line++;
foreach ($item as $col => $row) {
$sheet->setCellValueByColumnAndRow($col, $line, $row);
}
}
// Сохранение файла.
$objWriter = new PHPExcel_Writer_Excel2007($xls);
$objWriter->save(__DIR__ . '/' . basename($file, '.csv') . '.xlsx');