 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Mónica Cmdr

Registrado: 27 Sep 2002Mensajes: 136Ubicación: Pontevedra (España)
|
Publicado: Vie 24 Jun, 2005 10:37 am Asunto: Ayuda: Gráficas en excel |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 26 Jun, 2005 3:08 am Asunto: |
|
|
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 |
|
 |
Mónica Cmdr

Registrado: 27 Sep 2002Mensajes: 136Ubicación: Pontevedra (España)
|
Publicado: Lun 27 Jun, 2005 7:50 am Asunto: |
|
|
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
¿Qué hago mal?
Muchas gracias! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 27 Jun, 2005 8:04 am Asunto: |
|
|
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 |
|
 |
Mónica Cmdr

Registrado: 27 Sep 2002Mensajes: 136Ubicación: Pontevedra (España)
|
Publicado: Lun 27 Jun, 2005 8:17 am Asunto: |
|
|
Muchísimas gracias _Leo, ¡por fin funciona bien!
Gracias de nuevo y saludos! |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|