Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #11  
Antiguo 12-01-2011
Flecha Flecha is offline
Miembro
 
Registrado: nov 2006
Posts: 59
Poder: 18
Flecha Va por buen camino
Hola Wbarrantes.

Hace mucho de ésto, y... es cierto..., quizá debí acompañarlo de un pequeño manual de usuario, jejejejeje...
Intentaré ayudarte. A ver qué recuerdo...

La unit que me creé no es para cogerla y hacer copy-paste dentro de otro código. Es una unit totalmente independiente. Basicamente lo que contiene es una clase que me creé (la llamé TAplExcel), y varias constantes que también me creé.

Así que para utilizarlo lo que tienes que hacer es añadir la unit a tu proyecto (el archivo .PAS que te crees con mi unit llamala uExportExcel, que es como yo la llamé; o si le das otro nombre no olvides cambiarlo también en la cabecera del unit). Luego, desde tu programa, te creas una instancia a TAplExcel.

Código Delphi [-]
...
var MyAplExcel : TAplExcel;
begin
...
MyExcel : TAplExcel.Create;
try
... // utilización de la clase
 finally
 MyExcel.Destroy;
 end;
...
end;


Por lo demás decirte que la clase me la creé 100% basada en la utilización de macros de VisualBasic de Excel. Si echas un vistazo al código fuente, encontrarás que practicamente utilizo funciones y procedimientos que no existen en Delphi y que sólo pertenecen a VB Excel.

¿Cómo consigo utilizar VB Excel entremezclado con código Delphi? Es gracias a que me creo un objeto OLE del tipo "Excel.Application". Esto lo explico al principio de mi chorro-mensaje.

Un truco que utilicé. Yo no domino VB de Excel. Lo que yo hacía mientras diseñaba mi clase fue grabar una macro de Excel con las operaciones que yo quería recrear en mi clase. Luego hacía copy-paste sobre mi unidad, y poco más. Por desgracia hay algunas cosas que no se pueden adaptar.

Preguntas sobre cómo hacer un "merge" de celdas con la clase que me creé. Esto no lo implementé. No recuerdo si es que no lo intenté o si es que no pude.

El "merge" se aplica a un rango de celdas, y dicho rango ha de ser acotado entre 2 referencias a celda (cada una representando una esquina opuesta).
En VB de Excel, para hacer un "merge" acotado pora las celdas E1 y G5, sería éste código:
Código:
Range(Cells(1, "E"), Cells(5, "G")).Merge
Para hacer lo mismo desde Delphi tocaría cambiar varias cosas. Para empezar no se puede hacer uso de letras para indicar columnas. Hay que utilizar el valór numérico (5 para "E", y 7 para "G"). Y en vez de paréntesis (), muchas veces hay que sustituirlo por corchetes [].
No lo he provado, pero quizá esto equivalga al código en VB Excel.
Código Delphi [-]
MyExcel.Excel.Range[ MyExcel.Excel.Cells[1, 5], MyExcel.Excel.Cells[5, 7] ].Merge;
Si con ésto saltara una excepction, quizá habría que cambiarlo por esto otro:
Código Delphi [-]
var esquina1, esquina2, rango:variant;
begin
...
  esquina1 := MyExcel.Excel.Cells[1, 5];
  esquina2 := MyExcel.Excel.Cells[5, 7];
  rango := MyExcel.Excel.Range[ esquina1, esquina2 ];
  rango.Merge;
...
end;
Y si aún así sigue sin funcionar..., pues no se me ocurro ahora nada. Quizá es que no se pueda hacer.





Aprovecho y añado una breve desccripción de las propiedades, funciones y procedimientos públicos de la clase TAplExcel.


property Excel:Variant read Get_Obj_Excel;

Esta propiedad es la más importante.
Te da acceso al objeto OLE que es creado internamente dentro de la clase, y por medio del cual, a su vez, se accede a Excel. Por tanto, te da acceso al uso de código de VisualBasic de Excel.
Por ejemplo. Lo que en VB de Excel se escribe así:
Código:
vble = Cells(25, 3).Text
Utilizando la clase que me creé, sería así:
Código Delphi [-]
vble := MyExcel.Excel.Cells[25, 3].Text;
Esa línea de código lo que hace es tomar el valor que haya en la fila 25, columna 3 (letra "C"), del documento Excel.
Observa que lo que en VB va encerrado entre paréntesis (), en Delphi va entre corchetes [].


property WBook:Variant read Get_Obj_WBook;

El uso de esta propiedad equivale a lo que en VB de Excel sería utilizar el ActiveWorkBook, o lo que es lo mismo, el documento Excel activo.
Por tanto..., MyExcel.Excel.ActiveWorkBook equivaldría a MyExcel.WBook.


function CrearNuevoWBook : variant;

Esto equivale a lo que dentro de Excel sería "File" -> "New..." -> "Blank workbook". O sea, crear un nuevo documento Excel.
Esta función además retorna un objeto que da acceso directo a dicho nuevo documento. En cierto sentido equivaldría al WBook de antes.


procedure QuitarWBook(WorkBook:variant);

Como sabes, dentro de Excel puedes tener varios documentos abiertos. Con esta función, le pasas un documento y lo cierra. Es como en Excel ir a "File" -> "Close".


procedure QuitarWSheet (WorkSheet:variant);

Es como QuitarWBook, pero en vez de quitar un documento, quita una de las hojas del documento. Funciona igual. Hay que pasarle como parámetro algo que apunte a dicha hoja.


procedure GuardarDocumento(WorkBook:variant; PathAndName:string; MostrarAlertas:boolean);

Con ésto guardas el documento abierto en Excel. Hay que pasarle el objeto que contiene el documento, un nombre con la ruta para el archivo a crear, y decirle TRUE o FALSE dependiendo de si quieres que muestre o no posibles mensajes de alerta.


procedure CargarDocumento(PathAndName:string);

Para abrir con Excel un documento que tengas guardado. A dicho documento puedes acceder luego por medio de la propiedad WBook.


procedure NoGuardarDocumento(WorkBook:variant);

Simplemente se le quita al documento Excel la marca de "pendiente de grabar", pero el documento permanece abierto.
La consecuencia es que al querer cerrar el documento, éste consta como ya grabado, aunque sea mentira.


procedure MostrarAplExcel;

Con la clase que me creé, se puede trabajar con Excel sin que Excel sea visible por el usuario (ni siquiera aparece el botón abajo como si estubiera minimizado).
Al ejecutar este procedimiento, la aplicación Excel aparece en pantalla, y el usuario puede ver el documento que tengas abierto.


procedure OcultarAplExcel;

Lo mismo que MostrarAplExcel, pero para ocultar la aplicación Excel.
Es muy aconsejable mantener Excel oculto mientras trabajas con el documento. Así se evitan refrescos de pantalla, que es algo que resta mucha CPU, y consigues más velocidad. Aparte de que así también evitas que el usuario esté viendo "las tripas" del curro que estás haciendo.


procedure ControlErrorExcel;

Esto lo que hace es liberar la memoria (se borra de memoria el documento Excel), y lanzar una Exception.
Me lo creé para mi apaño personal, para tener un texto común como mensaje cuando detectase una situación que me impidiera crear el documento Excel que estaba intentando crear.


procedure ColorFondo (Selection:Variant; Color:integer);

Esto cambia el color de fondo de las celdas del documento. Dichas celdas deben ir indicadas en el parámetro Selection.
Por ejemplo, para poner de color rojo el fondo de la celda B1...
Código Delphi [-]
  MyExcel.ColorFondo ( MyExcel.Excel.Cells[2,1] , xl_CL_Rojo );
Que equivale en VB de Excel a poner ésto...
Código:
Cells(2,1).Interior.ColorIndex = $00000003
Hay varias constantes declaradas en la unit para trabajar con colores.


procedure PonerGrid (Selection:Variant; GrosorMarco, GrosorVerti, GrosorHoriz:integer);

Esto es para resaltar los bordes de las celdas contenidas dentro de un rango de celdas.
Se ha de indicar dicho rango de celdas (Selecction), y el grosor que se quiere para
- borde exterior (el marco)
- líneas interiores verticales
- líneas interiores horizontales
Para los tipos de grosores hay constantes declaradas en la unit.


procedure PonerMarco (Selection:Variant; Grosor:integer);

Lo mismo que PonerGrid, pero sólo para el borde exterior.


function LetraColumna (x:integer):string;

A esta función le pasas un número, y te devuelve la letra de columna correspondiente.


procedure SetPrintArea (Hoja : variant; x1,y1, x2,y2 : integer);

Esto es para definier el área de impresión de una hoja de un documento Excel. Hay que pasarle como parámetro la hoja en cuestión, y también el área (como coordenadas x-y, de las esquinas superior izquierda, e inferior derecha).

procedure SetSaltoPagVert (Hoja : variant; NumSalto, Columna : integer);

Al igual que SetPrintArea, este procedimiento es para preparar el documento Excel para su salida por impreosra. Como sabrás, Excel pagina automáticamente dependiendo de cuántas columnas hayas ocupado en la hoja Excel. Es posible que la paginación automática establezca cortes en lugares que no te resulten apropiados. Con SetSaltoPagVert puedes establecer "puntos de corte" que Excel deberá respetar a la hora de imprimir la hoja.
Debes pasarle la hoja en cuestión, un identificador para el punto de corte (se pueden poner varios), y la columna donde lo situas.






Para entender mejor el funcionamiento, te aconsejo que profundices en la utilización de VB de Excel, porque como habrás podido comprobar, la clase que me creé hace un continuo uso de dicho VB de Excel, permitiendo utilizar códigos fuente de VB (macros) intercalados dentro del código fuente de Delphi.
Sólo así podrás sacarle el máximo rendimiento a la clase que me creé.
Lo mejor es creárte macros en VB de Excel que hagan exactamente lo que tu quieres que luego se haga en Delphi. Luego coges esas macros, y haces copy-paste sobre tu código Delphi. Luego, cada vez que en dichas macros se haga uso de objetos propios de VB de Excel, dentro de Delphi lo traduces anteponiendo la propiedad TAplExcel.Excel a dicho objeto.
Por ejemplo..., para en VB Excel poner el valor "Hola mundo" dentro de la celda C5, se escribiría esto:
Código:
Cells(5, "C").Text = "Hola mundo"
En Delphi sería así:
Código Delphi [-]
MyExcel.Excel.Cells[5, 3].Text := 'Hola mundo';
Observa que se cambian también paréntesis () por corchetes [], y dobles comillas (") por simples ('), aparte de referenciar columnas con un número en vez de por su letra.




No puedo evitar escribir ladrillos. Cualquier explicación me parece poca para dejarlo suficientemente claro.
Lo siento.
Espero haber sido de ayuda.

Un saludo.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como utilizar Apis? JoeyJordison Varios 5 12-01-2007 21:48:52
como Utilizar una DLL de VB KaTo Varios 0 30-05-2004 19:01:30
como utilizar el UpdateSQL Irina SQL 10 17-03-2004 15:35:39
Como utilizar un DCR y PAS andrestsas Varios 1 26-10-2003 19:31:58
como utilizar sql plus fcran Oracle 2 10-09-2003 02:44:01


La franja horaria es GMT +2. Ahora son las 13:06:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi