miércoles, 13 de noviembre de 2013

Leer Excel desde Ax 2012

Aqui les dejo unas líneas para copiar y pegar si necesitan leer un archivo de excel desde Ax 2012. Después de leer las líneas pueden darle el tratamiento que sea necesario, ya sea que guarden esos datos en alguna tabla o lo que sea que necesiten hacer.

El archivo de excel de muestra no lo dejo aquí, pero es un simple excel a 5 columnas donde los dos primeros campos los leo como strings y los otros 3 como double por ser cantidades.

Espero que les sea de ayuda.


static void grwReadExcel(Args _args)
{
    SysExcelApplication application;
    SysExcelWorkbooks workbooks;
    SysExcelWorkbook workbook;
    SysExcelWorksheets worksheets;
    SysExcelWorksheet worksheet;
    SysExcelCells cells;
    COMVariantType type;
    FilenameOpen filename;

    int row = 1; //si el excel tiene nombres de columnas
    str producto, descripcion;
    int cantidadRecibida, documentoBase, numeroArticulosTotales = 0, existenDiscrepancias = 0;
    real igi;
    ;

    filename  = "C:\\Users\\Desa\\Documents\\EJEMPLO.xlsx" ; // nombre de archivo
   
    application = SysExcelApplication::construct();
    workbooks = application.workbooks();

    try
    {
        workbooks.open(filename);
    }
    catch (Exception::Error)
    {
        throw error("No se encontro el archivo" );
    }
    workbook = workbooks.item( 1);
    worksheets = workbook.worksheets();
    //nombre de la hoja dentro del excel
    worksheet = worksheets.itemFromName( "EJEMPLO DE ARTICULOS");
    cells = worksheet.cells();

    //Iterando las celdas y sacando valores
    do
    {
        //Incrementando a la siguiente fila en el excel
        row++;

        producto = cells.item(row, 1).value().bStr();
        descripcion = cells.item(row, 2).value().bStr();
        cantidadRecibida = real2int(cells.item(row, 3).value().double());
        igi = cells.item(row, 4).value().double();
        documentoBase = real2int(cells.item(row, 5).value().double());
        
        info( strFmt("idproducto: %1, descr: %2, cant: %3, igi: %4, docBase: %5" , producto, descripcion, cantidadRecibida, igi, documentoBase));

         numeroArticulosTotales++;
      
        //Guardando el tipo de celda en una variable COMVariantType y validando si esta vacia o no
        type = cells.item(row+ 1, 1 ).value().variantType();

    }
    while (type != COMVariantType::VT_EMPTY);

        info( strFmt("numero de articulos: %1" , numeroArticulosTotales));

    //Cerrando la app de excel
    application.quit();
}

2 comentarios:

  1. Hola amigo muy buen Pos me fue de gran ayuda, crees me puedas echar la mano con eso deseo leer un exel que tengo data en dos libros distintos como lo podria hacer ??

    ResponderBorrar
    Respuestas
    1. Si son dos archivos de excel tendrias que aplicar el proceso para cada uno, indicando en el filename el nombre de cada archivo, si a lo que te refieres son dos hojas en un archivo de excel puedes indicar el nombre de cada hoja en la línea:
      worksheet = worksheets.itemFromName( "EJEMPLO DE ARTICULOS");
      worksheet2 = worksheets.itemFromName( "Hoja2MismoArchivoExcel");

      Borrar