[AX 2012 R3 – How To] Exportar una tabla a Excel

[AX 2012 R3 – How To] Exportar una tabla a Excel

Exportar una tabla a excel es muy simple, desde cualquier formulario en Dynamics AX. Simplemente se debe hacer clic en el ícono con el logo de Microsoft Excel en la barra de herramientas.

Pero ¿Qué ocurre cuando debemos exportar datos modificados o filtrados?

Es ahí donde este tutorial puede ser de ayuda para los desarrolladores de Dynamics AX.

En un método crearemos el libro y llamaremos a los métodos que cargan la cabecera y los datos. Primeramente definimos la exportación al Excel:


void export2Excel()
{
SysExcelApplication xlsApplication;
SysExcelWorkBooks xlsWorkBookCollection;
SysExcelWorkBook xlsWorkBook;
SysExcelWorkSheets xlsWorkSheetCollection;
SysExcelWorkSheet xlsWorkSheet;
SysExcelWorksheet xlsWorkSheetToBeDeleted;
SysExcelRange xlsRange;
SysExcelCells cells;
SysExcelCell cell;

str fileName;
;

//Cargar datos temporales
//tmpTable = element.loadTmpTable();

//Nombre de archivo
fileName = FilePathControl.text();

//Iniciamos la instancia de Excel
xlsApplication = SysExcelApplication::construct();

//Creamos el Libro y Hoja de Excel
xlsWorkBookCollection = xlsApplication.workbooks();
xlsWorkBook = xlsWorkBookCollection.add();
xlsWorkSheetCollection = xlsWorkBook.worksheets();
xlsWorkSheet = xlsWorkSheetCollection.itemFromNum(1);

//Celdas corespondientes a la Cabecera
cells = element.fillExcelHeader(xlsWorkSheet.cells());

//Cargar celdas de datos
cells = element.fillExcelData(xlsWorkSheet.cells());

//Eliminar hojas que no se utilizarán
while(xlsWorkSheetCollection.count() > 1)
{
xlsWorkSheetToBeDeleted = xlsWorkSheetCollection.itemFromNum(2);
xlsWorkSheetToBeDeleted.delete();
}

//Ajustar columnas
xlsWorkSheet.columns().autoFit();

//Verificar si el archivo ya existe, para eliminarlo
if(WinApi::fileExists(fileName))
WinApi::deleteFile(fileName);

//Guardar documento Excel
xlsWorkbook.saveAs(fileName);

//Abrir documento Excel
xlsApplication.visible(true);
}

Ahora, procedemos a cargar la cabecera (generalmente corresponde al texto de la columna):


SysExcelCells fillExcelHeader(SysExcelCells _cells)
{
//Reemplazamos la X por el índice(empieza en 1) de columna
_cells.item(1,X).value(fieldPName(TABLA, COLUMNA));
return _cells;
}

Y por último accedemos a los datos para cargar el Excel:


SysExcelCells fillExcelData(SysExcelCells _cells)
{
#AviFiles
real calculatedProportion;
int indiceProgress = 0;
int row = 1; //row = 1 corresponde a la cabecera

int tickCount;
Array rowArr;
COMVariant comArr;
COM comRange;
;

select Count(RecId) from TABLA;

cantidadRegistros = TABLA.RecId;

progress.setCaption("Cargando datos...");
progress.setAnimation(AviTransfer);
progress.setTotal(cantidadRegistros);

//Obtener los datos necesario para cargar los datos.
while select * from TABLA
{
try
{
//Manejar el indicador de Progreso
indiceProgress++;
progress.setText(strfmt("Registro %1 de %2", indiceProgress, int642str(cantidadRegistros)));
progress.setCount(indiceProgress, 1);

//Filas
tickCount = WinAPI::getTickCount();
row++;

// Crear un array para completar la fila completa
rowArr = new Array(Types::String);

// Cargar cada celda
rowArr.value(1, TABLA.COLUMNA);

// Almacenar el Array
comArr = new COMVariant();
comArr.safeArray(rowArr, COMVariantType::VT_BSTR);

//Establecer el rango de columnas, reemplazar X por la letra de columna que corresponde al Excel
comRange = _cells.range(strFmt("A%1:X%1", row)).comObject();

//Agregar fila al rango
comRange.value2(comArr);
}
catch
{

}
}

indiceProgress = 0;
//Cerramos el indicador de progreso
progress.kill();

return _cells;
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.