Hoy os presento como he resuelto un problema que he tenido. Necesitábamos leer y escribir en un documento de excel desde Dynamics AX. A qui me encuentro que tenemos dos posibilidades:
- Mediante ADO
- Mediante clases propias de Dynamics AX
Aquí os propongo la segunda opción, utilizar clases propias de AX. Comenzamos! Os propongo un job para realizar las pruebas.
static void PTK_PruebaLecturaEscrituraExcel(Args _args)
{
FileName filename; // Para especificar ruta del fichero
COMVariantType type; // Para lectura de formato de celda
SysExcelApplication application; // Clase que maneja la app Excel
SysExcelWorkbooks workbooks; // Para almacenar los libros
SysExcelWorkbook workbook; // Para extraer el libro a tratar
SysExcelWorksheets worksheets; // Para almacenar las hojas
SysExcelWorksheet worksheet; // Para extraer la hoja a tratar
SysExcelCells cells; // Para almacenar las celdas
SysExcelCell cell; // Para extraer la celda a tratar
int col, fil; // Para posicionar fila y columna
str lectura; // Para almacenar el dato ledo
;
application = SysExcelApplication::construct(); // Instanciamos la app
workbooks = application.workbooks(); // Asignamos los libros a la app
//Especificamos el libro excel a tratar
filename = "D:\\prueba.xlsx";
// Abrir el documento excel para comprobar fallos
try {
workbooks.open(filename);
} catch (Exception::Error) {
throw error("File cannot be opened.");
}
workbook = workbooks.item(1); // Extraer el libro leido y asignarlo a variable. La variable workbooks puede tener varios libros
worksheets = workbook.worksheets(); // Extraer lista de hojas del libro. La variable worksheets contiene varias hojas
worksheet = worksheets.itemFromName('Hoja1'); // Seleccionar la hoja que queremos tratar
//worksheet = worksheets.itemFromNum(1); // Seleccionar la hoja que queremos tratar
cells = worksheet.cells(); // Extraer todas las celdas de la hoja a la variable cells
col = 1;
fil = 1;
// Leemos la celda
lectura = cells.item(fil, col).value().bStr();
// Leemos el formato de celda
type = cells.item(fil, col).value().variantType();
// Asignamos celda para grabar datos
cell = cells.item(fil, col);
// Si la celda esta vacia escribimos
if (type == COMVariantType::VT_EMPTY){
cell.value('Hola');
}
// Guardamos y cerramos
application.displayAlerts(false);
application.save();
application.quit();
info("Proceso finalizado");
}
Podríamos añadir ya la funcionalidad que queramos dependiendo de lo que quisieramos hacer, pero la base es esta. En próximos artículos os pondré la solución mediante ADO. Espero que os pueda servir de ayuda.
Saludos!
No hay comentarios:
Publicar un comentario