Reportes fáciles en C / C ++

Si está desarrollando en C / C ++ algún software para operadores (administradores) de hospitales, tiendas, servicios de alquiler de giroscopios, servicios de reparación de teléfonos celulares, entonces probablemente enfrentó la tarea de crear informes para imprimirlos en una impresora, o al menos en PDF. Hay muchos paquetes de terceros para Embarcadero RAD Studio que le permiten hacer esto. Como FastReport, QuickReport, Crystal Reports, etc. Pero en mi opinión, todos estos paquetes requieren una comprensión profunda de su mecanismo e interfaz. Lleva mucho tiempo estudiarlos, y lo más importante, el código para generar incluso el informe más simple consistirá en una gran cantidad de líneas. Cuando encontré por primera vez la tarea de generar informes en C / C ++, comencé con FastReport y me di cuenta de que no me gustaba esta herramienta.

En este mismo momento, se me ocurrió un pensamiento maravilloso: qué bueno sería tomar un archivo EXCEL simple, agregarle información estática y formatearlo para que se ajuste a sus necesidades. ¡El programa solo abrirá este archivo, lo llenará con datos dinámicos y lo guardará o enviará para imprimir! Esto sirvió como punto de partida para mi estudio del mecanismo OLE para trabajar con archivos de MS Office de programas desarrollados en Embarcadero RAD Studio.

En el curso de mi actividad, logré profundizar lo suficiente en el tema y ahora puedo decir con confianza que todas las herramientas que brindan MS Office y OLE proporcionan que cubren todas mis necesidades de informes. Bueno, si es así, entonces probablemente para otros desarrolladores sería una herramienta autosuficiente, simple y conveniente. Por lo tanto, se decidió escribir un archivo DLL y empaquetar en él una lista de todas las funciones de MS Excel que se usan comúnmente durante la creación de documentos de Excel. Esto es muy conveniente, porque para crear un informe, no necesita estudiar un montón de manuales u OLE. Todo lo que se requiere es cargar la DLL y sus funciones. Bueno, muchos pueden trabajar con archivos DLL.

Aquí está el sitio del proyecto en sí .

En el sitio del proyecto, el mecanismo para trabajar con DLL se describe con suficiente detalle; hay un ejemplo y una descripción de todas las funciones.

La DLL viene sin un archivo de encabezado y sin una biblioteca LIB estática. Por lo tanto, la DLL debe estar conectada dinámicamente usando la función LoadLibrary. El archivo ZIP con la biblioteca incluye los siguientes archivos:

  • " light_report.dll ": la propia biblioteca DLL;
  • " DLLTest.cpp ": un ejemplo del uso de la biblioteca;
  • " LPDLL.h ": el archivo de encabezado para un ejemplo de uso de la biblioteca (este no es el archivo de encabezado de la DLL);
  • " Report.xlsx ": documento MS EXCEL para un ejemplo de uso de la biblioteca.

El archivo de encabezado para el ejemplo de uso de la biblioteca LPDLL.h contiene las siguientes declaraciones:

  • enumeraciones que se utilizan como argumentos para las funciones de DLL;
  • tipos de funciones DLL;
  • Instancias de función DLL
  • Descriptor de descarga de DLL (" HINSTANCE DLL_Handle; ");
  • función LoadLightReportDLL , que carga dinámicamente la DLL y todas sus funciones;
  • Función FreeLightReportDLL que descarga la DLL.

El archivo LPDLL.h ya contiene todo lo que necesita para trabajar con la DLL y sus funciones. Pero también puede editarlo o tomar solo lo más necesario para su proyecto.

Imagine que acaba de conectar el archivo de encabezado "LPDLL.h" a su proyecto.

Luego, en el proyecto en sí solo necesita:

1) Declare un identificador variable a su informe:

Variant report; 

2) Cargue dinámicamente la DLL y todas sus funciones:

 if(!LoadLightReportDLL("C:\\LightReport\\light_report.dll"))return; 

3) A continuación, en la construcción try-catch, abra la plantilla de informe preparada (archivo MS Excel):

 report=OpenReport("C:\\LightReport\\Report.xlsx",0); 

4) Agregue algunos datos al informe:

 WriteCell(report, "Sheet1", 9, 1, "Hello world!"); 

...
5) Guarde el archivo o imprima:

 Save(report); SaveAs(report, "C:\\LightReport\\Report copy.xlsx"); ExportToPDF(report, "C:\\LightReport\\Report.pdf", false); PrintOut(report); 

6) Cierra el archivo:

 CloseReport(report); 

7) Descargue la biblioteca DLL:

 FreeLightReportDLL(); 

¡Y eso es todo! ¡Absolutamente nada más! Solo hay una advertencia, pero incluso eso, solo aparece durante la depuración. En una aplicación que funcione, todo funcionará bien. Me refiero a una situación en la que hay algún tipo de error al trabajar con un informe. El hecho es que el mecanismo OLE para trabajar con documentos implica solo lanzar excepciones cuando ocurren errores. Es por eso que al trabajar con funciones DLL, debe usar la construcción try-catch. En el bloque catch, debe cerrar el informe sin guardar:

 catch(...){CloseReport(report);} 
.
Al depurar, cuando se produce un error, puede detener el programa. En este caso, el proceso de MS Excel seguirá ejecutándose y será posible cerrarlo solo a través del administrador de tareas. Por lo tanto, al depurar la aplicación varias veces, se pueden iniciar varias instancias del proceso de MS Excel, dependiendo de la frecuencia con la que suspenda el programa cuando ocurra un error, sin esperar a que el código se ejecute en catch. Esto debe ser monitoreado.

En la versión, si se produce un error, el código especificado en el bloque catch definitivamente funcionará, el informe se cerrará y se completará el proceso de MS Excel. No se observarán procesos de MS Excel que cuelguen en el sistema. Pero aún así intentan escribir código sin errores, así que espero que no tenga esta situación en una aplicación en ejecución.

Finalmente, necesitas agregar:

  1. La DLL utiliza tipos de datos independientes de la plataforma, como unsigned short , unsigned long y char . Esto es comprensible por qué.
  2. El ejemplo está escrito en el entorno Embarcadero Builder C ++ 10. En consecuencia, todo el código corresponde a este entorno y, tal vez, deberá realizar algunos cambios en el código de ejemplo para que todo funcione en su entorno.
  3. El cuello de botella de esta DLL es el uso del descriptor del archivo de informe en formato Variante . Este es un formato bastante específico y sospecho que puede ser difícil usar la biblioteca fuera de Embarcadero RAD Studio. Honestamente, no lo comprobé.

Por lo tanto, para el futuro, se planea agrupar toda la funcionalidad en una clase y ocultar este formato de Variante dentro de la clase para que solo se proporcionen al usuario los formatos C / C ++ generalmente aceptados. Nunca he intentado empaquetar clases en archivos DLL, leí que necesariamente surgirán dificultades con esto. Sin embargo, lo entenderemos! Mientras tanto, gracias por su atención, estaré muy feliz si este artículo y la DLL ayudan a alguien.

Enlace al proyecto .

Source: https://habr.com/ru/post/456102/


All Articles