Paso 6: Automatización de C++ de Excel...
TCLogger2Excel comenzó como una aplicación de línea de comandos de Windows, pero se convirtió en una aplicación basada de diálogo de MFC para agregar el cuadro de diálogo que se establece los valores por defecto en la sección de variables de cada hoja de cálculo de Excel. La ventaja de utilizar MFC es que es fácil! No es una biblioteca de interfaz de usuario perfecta, pero es muy fácil de usar. No cubre el código MFC en este Instructable, pero en su lugar se centrarán en explicar partes fundamentales del código que puede ser útil al escribir otros programas. El primero es tan cómo automatizar Excel desde C++.
En primer lugar con algunas palabras acerca de ambas opciones, C++ y Excel.
Excel fue seleccionado porque es una poderosa herramienta para la manipulación y visualización de datos. Gráficos de Excel hacen nuestros empuje y presión curvas visualmente comprensible. Las fórmulas de Excel en el a & n matemáticas de cubierta de la pestaña que está más allá de mi nivel de confort. Tomando el TC registrador datos grabados y ponerlo en Excel el usuario puede ahora manipular y realizar infinidad de cálculos y operaciones.
Por otro lado, C++ es mi lenguaje de programación de elección! No voy aburrirlos con un largo monólogo sobre sus virtudes o las faltas de otros lenguajes de programación. Sólo diré que como programador profesional de varias décadas, y en muchas plataformas, C++ proporciona más energía a la mayor conveniencia. Con lo que puede no sólo generar código nativo optimizado, pero con C++ moderno puedo utilizar las potentes funciones de la biblioteca estándar de C++ que rivalizan con los de cualquier otro lenguaje de programación, en cuanto a potencia, comprensibilidad y facilidad de uso.
Automatizar Excel desde C++
COM automatización facilita automatizar Microsoft Excel. Para comenzar hay que importar las bibliotecas de tipos de Excel como se muestra a continuación (de ExcelAutomation.cpp):
Esto hará que el compilador genere los archivos de encabezado (EXCEL.tlh y MSO.tlh) y archivos de aplicación (EXCEL.tli y MSO.tli) que simplifican el uso de los objetos de automatización COM que utilizaremos. Si abres los archivos .tlh encontrará una gran cantidad de información que será útil como realizar diversas tareas.
A continuación tenemos que crear una instancia del objeto application de Excel. El código siguiente se toma de la función CreateExcelSpreadsheet en ExcelAutomation.cpp...
El primer bloque configura el entorno de la COM y con clase de scope_exit de N4189, rasga abajo cuando aShutdown sale de alcance el final de la función:
El siguiente bloque veremos si el registro en este equipo tiene una entrada para Excel. No es una garantía que Excel está instalado pero es un buen comienzo:
Ahora creamos una instancia del objeto de Excel:
Con esta configuración en su lugar que podemos ahora crear hojas de trabajo, rellenar celdas, crear gráficos, y mucho más. Para ilustrar esto nos luego hacer visible la aplicación, crear un libro y maximizar la ventana de la aplicación.
pXLBook es el objeto de libro de Excel que vamos a utilizar a través del resto del programa.
La función (mal llamada) ProduceExcelWorkbook en ExcelAutomation.cpp siempre trabajará con la hoja de cálculo Excel activo:
Podemos dar la hoja de cálculo un nombre código como este:
Es importante tener en cuenta que los objetos de Excel con un nombre que termina en el Ptr como Excel::_WorksheetPtr son RAII C++ objetos similares a los ofrecidos por N4189. _bstr_t es también un objeto RAII. En pocas palabras eso significa que la memoria detrás de estos objetos automáticamente saldrá cuando la variable sale de alcance, incluso si eso sucede debido a una excepción. (Este último es un concepto que muchos programadores de C y C++ se olviden! Es muy importante utilizar RAII o asegurar lo contrario objeto limpiar cuando una excepción se desenrolla. Si bloquear una CRITICAL_SECTION usando por ejemplo EnterCriticalSection pero no LeaveCriticalSection cuando una excepción hace que el código para relajarse, tal vez incluso una excepción en algún lugar de una biblioteca de llamar, se escapará el bloqueo y será casi imposible detectar incluso bajo el depurador. Usted acabará con un callejón sin salida que no tiene sentido! Utilizar objetos RAII! La única alternativa es usar bloques try/finally para todos los recursos!)
Más adelante cuando necesitemos una nueva hoja de cálculo el código siguiente crea:
Con una hoja de cálculo activa, pueden colocar datos en una celda usando una función como esta de ExcelAutomation.cpp:
Observe que un "rango de celdas" (pDataRange) es creado y asignado un valor de cadena. También puede preparar una matriz SAFEARRAY de datos para asignar a un rango de celdas. Para ver cómo es esto mira ExcelAutomation.cpp líneas 270-397.
ExcelAutomation.cpp también muestra cómo agregar un gráfico a una hoja de cálculo (2 ejemplos diferentes), personalizar las etiquetas de tabla, agregar una línea de tendencia, las células de color, y cambiar tamaños de fuente de la etiqueta.
Un Consejo final... Si crea una macro en Excel y luego editarlo, verá código básico Visual que es muy fácil de convertir en C++ utilizando los ejemplos proporcionados en ExcelAutomation.cpp.