PHP - Seleccionar archivo mas reciente xlsx

 
Vista:
Imágen de perfil de Alberto

Seleccionar archivo mas reciente xlsx

Publicado por Alberto (9 intervenciones) el 11/08/2022 00:34:11
Buen dia tengo el siguiente codigo para importar la informacion de un excel a mysql a una tabla especifica mi pregunta es como puedo hacer que seleccione el archivo mas reciente.

Los pongo en contexto en una carpeta compartido suben un archivo cada hora en el cual vienen todos los registros de produccion lo que quiero es ingresar esos datos a una base de datos y asi poder mostrar en una pagina web toda la produccion por hora.\

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# Cargar clases instaladas por Composer
require_once "vendor/autoload.php";
 
# Nuestra base de datos
require_once "bd.php";
 
# Indicar que usaremos el IOFactory
use PhpOffice\PhpSpreadsheet\IOFactory;
 
# Obtener conexión o salir en caso de error, mira bd.php
$bd = obtenerBD();
 
# El archivo a importar
$rutaArchivo = "Reports/ASSOCIATE_SCANNING_REPORT_20220725060005.xlsx";
$documento = IOFactory::load($rutaArchivo);
 
# Se espera que en la primera hoja estén los productos
$hojaDeScanning = $documento->getSheet(0);
 
# Preparar base de datos para que los inserts sean rápidos
$bd->beginTransaction();
 
# Preparar sentencia de productos
$sentencia = $bd->prepare("insert into scanning_report
(Warehouse,Zone,From_Sc,To_Sc,User_Name_Sc,Date_Sc,Material_Number_Sc,Serial_Number,Quantity,Description) values
(?, ?, ? ,?, ?, ?, ?, ?, ?, ? )");
 
# Calcular el máximo valor de la fila como entero, es decir, el
# límite de nuestro ciclo
$numeroMayorDeFila = $hojaDeScanning->getHighestRow(); // Numérico
$letraMayorDeColumna = $hojaDeScanning->getHighestColumn(); // Letra
# Convertir la letra al número de columna correspondiente
$numeroMayorDeColumna = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($letraMayorDeColumna);
 
// Recorrer filas; comenzar en la fila 2 porque omitimos el encabezado
for ($indiceFila = 2; $indiceFila <= $numeroMayorDeFila; $indiceFila++) {
 
    # Las columnas están en este orden:
    $warehouse = $hojaDeScanning->getCellByColumnAndRow(1, $indiceFila);
    $zone = $hojaDeScanning->getCellByColumnAndRow(2, $indiceFila);
    $from = $hojaDeScanning->getCellByColumnAndRow(3, $indiceFila);
    $to = $hojaDeScanning->getCellByColumnAndRow(4, $indiceFila);
    $userName = $hojaDeScanning->getCellByColumnAndRow(5, $indiceFila);
    $dateTime = $hojaDeScanning->getCellByColumnAndRow(6, $indiceFila);
    $materialNumber = $hojaDeScanning->getCellByColumnAndRow(7, $indiceFila);
    $serialNumber = $hojaDeScanning->getCellByColumnAndRow(8, $indiceFila);
    $quantity = $hojaDeScanning->getCellByColumnAndRow(9, $indiceFila);
    $description = $hojaDeScanning->getCellByColumnAndRow(10, $indiceFila);
    $sentencia->execute([$warehouse, $zone, $from, $to, $userName, $dateTime, $materialNumber, $serialNumber, $quantity, $description]);
}
 
# Hacer commit para guardar cambios de la base de datos
$bd->commit();


El problema para subir el archivo es que los archivos que estan en la carpeta compartida aparecen con un nombre predefinido y la fecha en que se compartio espero me puedan ayudar a resolver este problema
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Ivan

Seleccionar archivo mas reciente xlsx

Publicado por Ivan (118 intervenciones) el 11/08/2022 19:36:24
Hola,

asumo que el nombre de tus archivos es del estilo ASSOCIATE_SCANNING_REPORT_20220725060005.xlsx

En ese caso si tienen siempre el mismo nombre y sólo cambia la fecha en formato AAAAMMDDHHMMSS se pueden ordenar alfabéticamente de A-Z y el último será el más reciente.

Para hacerlo simplemente lees todos los elementos del directorio, filtras el resultado por archivos (desechamos subdirectorios y archivos del sistema), añades los archivos a un array, ordenas el array y el primer elemento es el que quieres.

Este es un código básico, si hay más nombres de archivos puedes añadir más condicionales y miras que coincidan los nombres de archivos con el que buscas.

1
2
3
4
5
6
7
8
9
10
<?php
$directorio = 'F:/wamp64/www/etc./';
$scanResult = scandir($directorio);
$archivos = [];
foreach($scanResult as $aux) {
  if (is_file($aux)) $archivos[] = $aux;
}
sort($archivos);
var_dump($archivos);
?>

Dependiendo de si trabajas en localhost o en el servidor puede que debas afinar con la ruta del directorio, yo lo he probado en local.

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Alberto

Seleccionar archivo mas reciente xlsx

Publicado por Alberto (9 intervenciones) el 16/08/2022 00:16:39
Que tal amigo asi es siempre tiene el mismo nombre lo unico que cambie es el formato de la fecha

Si estoy trabajando localmente y de echo la carpeta donde tengo los archivos esta dentro del proyecto por eso solo tengo reports/

Entonces al momento de seleccionar el archivo en mi codigo quedaria algo asi oh lo implemente mal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Obtener conexión o salir en caso de error, mira bd.php
$bd = obtenerBD();
 
$directorio = 'Report/';
$scanResult = scandir($directorio);
$archivos = [];
foreach($scanResult as $aux) {
  if (is_file($aux)) $archivos[] = $aux;
}
sort($archivos);
var_dump($archivos);
 
# El archivo a importar
# Recomiendo poner la ruta absoluta si no está junto al script
# $rutaArchivo = "Report/ASSOCIATE_SCANNING_REPORT_20220719080006.xlsx";
$documento = IOFactory::load($aux);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alberto

Seleccionar archivo mas reciente xlsx

Publicado por Alberto (9 intervenciones) el 16/08/2022 00:34:03
Me mostro el siguiente error y en el muestra el archivo mas reciente tal y como necesitaba

array(0) { }
Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Reader\Exception: File "ASSOCIATE_SCANNING_REPORT_20220815160005.XLSX" does not exist. in C:\xampp\htdocs\ScanningHour\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Shared\File.php:149 Stack trace: #0 C:\xampp\htdocs\ScanningHour\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\IOFactory.php(129): PhpOffice\PhpSpreadsheet\Shared\File::assertFile('ASSOCIATE_SCANN...') #1 C:\xampp\htdocs\ScanningHour\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\IOFactory.php(100): PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile('ASSOCIATE_SCANN...', NULL) #2 C:\xampp\htdocs\ScanningHour\importar.php(26): PhpOffice\PhpSpreadsheet\IOFactory::load('ASSOCIATE_SCANN...') #3 {main} thrown in C:\xampp\htdocs\ScanningHour\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Shared\File.php on line 149

Y el codigo es este de la linea 149
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
        if (!is_file($filename)) {
            throw new ReaderException('File "' . $filename . '" does not exist.');
        }
 
        if (!is_readable($filename)) {
            throw new ReaderException('Could not open "' . $filename . '" for reading.');
        }
 
        if ($zipMember !== '') {
            $zipfile = "zip://$filename#$zipMember";
            if (!self::fileExists($zipfile)) {
                throw new ReaderException("Could not find zip member $zipfile");
            }
        }
    }

De antemano gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Ivan

Seleccionar archivo mas reciente xlsx

Publicado por Ivan (118 intervenciones) el 16/08/2022 12:13:32
Hola,

te contesto desde el trabajo en un momentín que tengo jeje.

Creo que el error básicamente es que en tu función inicial le pasabas el archivo junto con la ruta:

1
2
3
# El archivo a importar
$rutaArchivo = "Reports/ASSOCIATE_SCANNING_REPORT_20220725060005.xlsx";
$documento = IOFactory::load($rutaArchivo);

Y por lo que veo ahora sólo le pasas el nombre del archivo:

1
$documento = IOFactory::load($aux);

Como el código está fragmentado y no coinciden las lineas de errores con las lineas de código no lo puedo asegurar, pero básicamente el error principal es File "ASSOCIATE_SCANNING_REPORT_20220815160005.XLSX" does not exist

Y esto significa que no lo encuentra (porque sí existe). De modo que debe ser un tema de ruta al archivo.

Supongo que con cambiar

1
$documento = IOFactory::load($directorio . $aux);

Debería funcionar.

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alberto

Seleccionar archivo mas reciente xlsx

Publicado por Alberto (9 intervenciones) el 16/08/2022 15:54:12
Gracias lo solucione de la siguiente manera :

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
36
37
38
39
40
# Obtener conexión o salir en caso de error, mira bd.php
$bd = obtenerBD();
 
$str_path = 'Reports/';
 
$cls_rii =  new \RecursiveIteratorIterator(
    new \RecursiveDirectoryIterator( $str_path ),
    \RecursiveIteratorIterator::CHILD_FIRST
);
 
$ary_files = array();
 
foreach ( $cls_rii as $str_fullfilename => $cls_spl ) {
 
    if($cls_spl->isFile())
    {
        $ary_files[] = $str_fullfilename;
    }
 
}
 
$ary_files = array_combine(
    $ary_files,
    array_map( "filemtime", $ary_files )
);
 
arsort( $ary_files );
 
$str_latest_file = key( $ary_files );
 
echo "file:".$str_latest_file."\n";
echo "time:".$ary_files[key( $ary_files )];
 
date_default_timezone_set('America/Chihuahua');
		$fecha = date('Y-m-d H:i:s');
 
# El archivo a importar
$rutaArchivo = $str_latest_file;
 
$documento = IOFactory::load($rutaArchivo);

Gracias por todo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar