Estaba trabajando en una interfaz de importación de datos entre una aplicación Laravel y Oracle Fusión Cloud. El caso es que necesitaba generar un archivo .csv para que Oracle lo consumiera.
Debo decir que Oracle no la pone muy fácil para integrarse con otros sistemas, o quizá fue que no tuve la oportunidad de conectarme mediante REST. Bueno el caso es que generé el archivo .CSV con mi amado Laravel Excel pero Oracle mandaba error al momento de importarlo. Después de mucho batallar tratando de arreglarlo me rendí, todo parecía estar bien pero Oracle seguía rechazándolo.
Entonces decidí hacerlo mediante otra forma y es la que les mostraré ahora.
Lo primero que hay que hacer es crear la ruta en nuestro archivo web.php:
Route::get('exportfile', 'ExportController@export');
Ahora hay que crear el controlador llamado ExportController
Ya en nuestro archivo exportController.php debemos crear el método export
public function export(){
}
Bien, estamos listo, ahora cuando vayamos a la ruta /exportfile se ejecutara el método export de nuestro controlador (que aun no tiene nada).
Ahora entremos al método export y agreguemos las siguientes lineas:
//Nombre del archivo que generaremos
$fileName = 'InvTransactionsInterface.csv';
//Arreglo que contendrá las filas de datos
$arrayDetalle = Array();
//Estos son los datos que recibimos del modelo que queremos leer, aquí ustedes cámbienlo por el modelo que necesiten
$items=EppItemDelivery::where('status','=',1)->get();
//El encabezado que le dice al explorador el tipo de archivo que estamos generando
$headers = array(
"Content-type" => "text/csv",
"Content-Disposition" => "attachment; filename=$fileName",
"Pragma" => "no-cache",
"Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
"Expires" => "0"
);
El siguiente paso es llenar el arreglo con los datos que recibimos de Laravel
//recorremos los registros y con ellos llenamos nuestro arreglo arrayDetall
foreach ($items as $item){
$arrayDetalle[] = array('Nombre' => $item->nombre,
'Campo2' => "-$item->field2",
'Status' => $item->status
);
}
//construyamos un arreglo para la información de las columnas
$columns = array('Nombre',
'Campo2',
'status');
Hasta este punto ya tenemos toda la información que necesitamos, ahora vamos a empezar a construir nuestro archivo .csv abriendo el archivo, agregando la linea y cerrándolo.
Cuando tengamos listo el archivo .csv los vamos a meter en una función Callback para que después sea enviado al usuario para su descarga.
$callback = function() use($arrayDetalle, $columns) {
$file = fopen('php://output', 'w');
//si no quieren que el csv muestre el titulo de columnas omitan la siguiente línea.
fputcsv($file, $columns);
foreach ($arrayDetalle as $item) {
fputcsv($file, $item);
}
fclose($file);
};
//Esto hace que Laravel exponga el archivo como descarga
return response()->stream($callback, 200, $headers);
Con esto su .csv ya debería descargarse.