Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Ayuda: Gráficas en excel

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ayuda: Gráficas en excel Responder citando

Hola, tengo que generar en excel unas gráficas a partir de los datos obtenidos en mi aplicación.
He conseguido hacer "algo", pero no acabo de hacerlo funcionar perfectamente y no sé porqué.

Lo que hago es exportar los datos a una hoja y, a partir de esos datos, hago la gráfica.
Pero la primera gráfica que hago aparece con dos series. La Serie1 aparece como vacía, pero aparece. Y la Serie2 sí que ya contiene los datos que quiero.

Este es el código que estoy utilizando:

Código:

    Variant Aplicacion;
    Variant Libros;
    Variant Hojas;
    Variant Libro;
    Variant Hoja;
    Variant Celda;
    Variant HojasGraficas;
    Variant HojaGrafica;

    int i=0;

    Grafica *pGraf=Lista->ListaLOGs->pGraficas;
    LOG *pL=Lista->ListaLOGs;

    Aplicacion=CreateOleObject("Excel.Application");
    Aplicacion.OlePropertySet("Visible", true);
    Libros=Aplicacion.OlePropertyGet("Workbooks");
    Libros.OleProcedure("Add");
    Libro=Libros.OlePropertyGet("Item",1);
    Hojas=Libro.OlePropertyGet("Worksheets");
    HojasGraficas=Libro.OlePropertyGet("Charts");

    while (pL!=NULL) {

        if (i>2) {
            Hojas.OleProcedure("Add"); //si necesito mas de 3 hojas, tengo que añadirselas
        }
        Hoja=Hojas.OlePropertyGet("Item",i+1); //selecciono la hoja correspondiente
        for (int j=0;j<512;j++) {
            Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",j+1,1).OlePropertySet("Value",j);
            Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",j+1,2).OlePropertySet("Value",pGraf->DatosGrafica.NivelRef-(60*pGraf->DatosGrafica.Puntos[j]*0.0052));
        }

        HojasGraficas.OleProcedure("Add");
        HojaGrafica=HojasGraficas.OlePropertyGet("Item",1);
        HojaGrafica.OlePropertySet("ChartType",4);
        Variant Serie=HojaGrafica.OlePropertyGet("SeriesCollection");

        Variant Rango=Hoja.OlePropertyGet("Range","B1:B512");
        Serie.OleProcedure("Add",Rango);

        pGraf=pGraf->sigGrafica;
        i++;
        if (pGraf==NULL) {
            pL=pL->sigLOG;
            if (pL!=NULL)
                pGraf=pL->pGraficas;
        }
    }


Intuyo que no añado bien las series o algo.
Espero que alguien me pueda ayudar.

Muchas gracias!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Mónica:

Por defecto cuando creas una grafica la primera serie se crea automáticamente. Tu en este caso le estas dando datos para la segunda serie que has creado tu, dejando sin usar la primera que se ha creado automáticamente.

Una forma más sencilla, es darle en el rango los datos para las dos series (o más) al mismo tiempo, automáticamente por cada columna creara una nueva serie, para ello cambia las siguientes líneas de tu código:
Código:
//...
Variant Serie=HojaGrafica.OlePropertyGet("SeriesCollection");
Variant Rango=Hoja.OlePropertyGet("Range","B1:B512");
Serie.OleProcedure("Add",Rango);
//...

Por estas otras:
Código:
//...
Variant Rango=Hoja.OlePropertyGet("Range","A1:B512");
const int xlColumns = 2;
HojaGrafica.OleProcedure("SetSourceData", Rango, xlColumns);
//...

En caso de que no te guste este método avísame e intentare poner un ejemplo creando serie por serie (aunque mas o menos ya lo tenias...).
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchísimas gracias _Leo.
Era lo que suponía: que por defecto Excel crea una gráfica con dos series, pero el caso es que necesito gráficas "dobles", pero también "simples".
Hice lo que me dijiste y bien, hace la gráfica doble: una serie con los datos de la columna A y otra con los de la columna B. Pero éso no es lo que necesito. Quiero que represente únicamente los datos de la columna B en una sola serie, claro.
Entonces lo que hice fue cambiar en tu código el rango:

Código:

Variant Rango=Hoja.OlePropertyGet("Range","B1:B512");


y el numero de columnas:

Código:

const int xlColumns=1;
HojaGrafica.OleProcedure("SetSourceData",Rango,xlColumns);


Pero no funciona: al comenzar a hacer las gráficas, sale un aviso de excel diciendo que el número máximo de series por gráfica es 255, y según yo entiendo le estoy pidiendo que haga solo una Mad

¿Qué hago mal?

Muchas gracias!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Has cambiado el valor de la constante "xlColumns", tienes que dejarlo con el valor que puse, o sea "2".

Aunque en este caso haya coincido con el numero de columnas ese parámetro no se refiere al numero de columnas, sino a si los datos de las series los tiene que coger de las celdas por columnas o por filas, la constante "1" corresponde a "xlRows" que es lo que tu le estas pasando con el cambio que has hecho.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchísimas gracias _Leo, ¡por fin funciona bien!

Gracias de nuevo y saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.