2010-07-28 195 views
16

Necesito crear hojas de Excel desde mi código de Java que contiene tablas como el gráfico de barras, el gráfico de líneas, etc. usando la biblioteca de POI de Apache. ¿Es posible? No puedo encontrar ningún ejemplo de código útil para el mismo.Crear tabla de Excel utilizando Apache POI

¿Hay alguna otra alternativa para esto aparte de la biblioteca de POI para Java?

+1

Aquí hay un tutorial que explica [cómo crear un gráfico en Excel con POI/JFreeChart] (http://thinktibits.blogspot.com.au/2012/12/Java-POI-Excel-Create-Chart-Example- JFreeChart-Part-4.html) en Java. – user1933158

Respuesta

17

Solo puede usar la plantilla de Excel para conservar el gráfico con POI. Significa que crea un archivo de plantilla de Excel con un gráfico y vincula el origen de datos del gráfico a un definido, luego puede cargar el archivo de plantilla desde el PDI y usar el código para cambiar el definedName. POI actual no admite la creación de gráficos desde cero.

+1

Hola Liya, Muchas gracias por la respuesta. Lo he intentado de la manera que me sugirió. Se requiere un rango con nombre dinámico (utilizando la función de desplazamiento) en el archivo Excel de plantilla (con un gráfico vacío que tiene datos de origen como ese datasource dinámico). He utilizado el procedimiento como en el siguiente enlace: 'http://www.youtube.com/watch?v=7le-m8YRP6M' – javdev

+0

Pero estoy frente al siguiente problema: Después de guardar con éxito un rango con nombre diga 'testrange ', cada vez que hago clic en cualquier otra celda de la hoja y luego vuelvo a verificar la fórmula de' testrange ', se desentiende. por ej. si lo guardo como "= OFFSET (A1 ,,, COUNTA (A: A), 2)" y luego haga clic en alguna otra celda. Ahora, si vuelve a verificar la fórmula de 'testrange', se muestra algo así como: "= OFFSET (Hoja1! XFB11 ,,, CONTARA (Hoja1! XFB: XFB), 2)" y esto cambia cada vez que lo compruebo. Me enfrento a este problema en Excel 2003 y 2007 también. Sugiera amablemente si estoy haciendo algo mal al establecer el rango dinámico. – javdev

+0

Su fórmula utiliza la dirección relativa, intente con la dirección absoluta COMPENSACIÓN ($ A $ 1 ,,, Count ($ A $ A), 2) – liya

1

Esto será extremadamente complicado de hacer desde el principio, ya que tendrá que averiguar qué necesita ir en el archivo de Excel para crear los gráficos. Yo iría por una ruta diferente.

Cree un archivo de Excel que incluya una macro que cree el gráfico de barras, etc. para algunos datos (utilizando Excel de la forma habitual). A continuación, utilice Apache POI para crear un archivo con los datos que desee e inicie Excel desde Java, ejecutando la macro que crea los gráficos.

+0

Hola DJ, Gracias por la respuesta rápida. En realidad, estoy haciendo exactamente lo que sugirió. Pero en este caso, la velocidad de la macro ejecución es muy lenta en el caso de datos muy grandes, que es mi problema. También los problemas de seguridad están presentes en el uso macro. Por lo tanto, quiero crear los gráficos usando la biblioteca POI. ¿Es posible? Gracias y saludos, Abhinav – javdev

+0

Estoy seguro de que sí, pero es posible que deba averiguar exactamente cómo es un archivo que contiene los gráficos. Todavía crearía un ejemplo con Excel y luego lo reproduciré usando POI. La especificación completa de los archivos xlsx está disponible, pero es extremadamente complicada. – DJClayworth

4

¿Hay alguna otra alternativa para esto aparte de la biblioteca de POI para Java?

Hay algunas otras bibliotecas también, pero no estoy seguro si se puede escribir algo así como un gráfico.

si se puede usar la versión más reciente de Office (las que usan el XML archivos de formato basado), que se puede utilizar un enfoque diferente:

  • cree un archivo de Excel con una nueva versión de Office, que contiene los cuadros que necesita y algunos datos ficticios.
  • descomprime ese archivo de Excel y extrae los archivos XML desde adentro. De mayor interés serán los archivos xl \ worksheets \ sheet1.xml xl \ worksheets \ sheet2.xml o xl \ worksheets \ sheet3.xml (dependiendo de qué hojas se usaron)
  • Eche un vistazo al formato de archivo (es más más complicado que usar POI), pero no debería ser tan difícil identificar los datos "ficticios" que ingresó antes.
  • Utilice Velocity o FreeMarker para transformar ese archivo xml en una plantilla (reemplazando sus datos ficticios por variables y macros que producirían el mismo resultado)
  • Escriba un pequeño programa (solo unas líneas) que le tome datos reales , se fusiona con la plantilla y empaqueta todo en un zip, pero pone la extensión * .xlsx.

Sé que los pasos anteriores parecen un poco complicados, pero si no tiene archivos de Excel demasiado complicados, debería ser más fácil de lo que parece.

+0

Hola Adrian, Muchas gracias por la respuesta rápida y la información valiosa. Este enfoque parece razonable, pero hay pocas preocupaciones en él: 1. Deseo admitir tanto Excel 2003 como 2007. 2. El xml para la generación de gráficos es complejo de comprender. Es cualquier otra alternativa a estos problemas. También mencionó que "hay algunas otras bibliotecas también, pero no estoy seguro de si puede escribir algo así como un gráfico". -> Puede sugerir algunos (que son gratuitos), que podrían proporcionar esta funcionalidad. Gracias de nuevo, Abhinav – javdev

+2

Algunas otras bibliotecas de excel: http://jexcelapi.sourceforge.net/, http://sourceforge.net/projects/openxls/, https://xlsql.dev.java.net/ , que hay muchos puentes de Java a COM que permiten usar una instalación de Excel directamente desde Java, por ejemplo http://danadler.com/jacob/ (pero hay muchos otros también). Otra opción es usar OpenOffice (ya que es bastante fácil codificar su API desde Java) y dejar que OpenOffice exporte los resultados a los formatos de Excel correspondientes. –

2

El hilo se ve viejo y no sé si ya has descubierto una forma o si todavía estás buscando una.

Pero esto es lo que haría. Hay una biblioteca gratuita llamada JFreeChart. Puede usarlo para generar un archivo JPG o PNG que luego puede insertar en el archivo Excel cuando lo crea con Apache POI.

Pero la desventaja de este método es que los datos en el gráfico no cambiarán dinámicamente cuando cambie los datos en la hoja de cálculo como es el caso de Excel. Ahora eso es algo con lo que no puedo vivir.

Así que voy a investigar un poco ahora. Estoy bastante seguro de que, dado que se ha formulado la pregunta, debe agregarse una función en Apache POI u otra forma elegante de hacer las cosas. Si encuentro alguno, me aseguraré de publicar mis hallazgos aquí.

---- ---- ACTUALIZACIÓN

En mi investigación que dura aproximadamente una hora, sólo pude encontrar una biblioteca adecuada llama SmartXLS (por favor, google, no pude publicar el enlace porque i' Soy un novato y se implementó el mecanismo de prevención de correo no deseado) que está remotamente cerca de lo que usaría. Puede generar tanto el Excel como el gráfico a través de un programa. El sitio web es muy simple y no pude encontrar ninguna información de licencia así que estoy asumiendo que es gratis para uso personal y comercial. Pude descargar la biblioteca sin ningún problema. No lo he usado todavía Pruébalo y cuéntanos cómo funciona.

+0

Hola Karthik, gracias por la respuesta. POI tiene la limitación como descubriste. Y tampoco pude optar por SmartXLS ya que no es gratis. JFreeChart es una API extremadamente buena, pero quería gráficos dinámicos de Excel. Entonces, utilicé el enfoque como se discute en las publicaciones a continuación con liya y dj. – javdev

+0

Básicamente utilicé poi para volcar los datos en el archivo de Excel y usé la macro de Excel para crear los gráficos a partir de esos datos siempre que Excel se abra la primera vez. – javdev

+0

¿Se puede publicar un fragmento de la macro que utiliza en excel para crear el gráfico? Estoy bastante seguro de que puedo googlearlo. Al ver que tienes una solución de trabajo, prefiero preguntarte y ahorrar algo de tiempo que reinventar esa rueda. Gracias por responder. –

6

En poi-3.8, el soporte para gráficos parece provenir.

Ver this discussion.

Y, en particular, the example.

+4

(Parece que esta pregunta se ve bastante, así que pensé que agregar un comentario sobre una respuesta de 3 años no puede doler) Desafortunadamente, hasta ahora no han agregado nada más que diagramas de dispersión y de línea. Afortunadamente, la creación de nuevos tipos de gráficos no parece ser tan difícil; basándose en los esquemas ooxml (compruebe el código fuente de ScatterChart en apache poi para ver cómo), puede intentar agregar nuevos tipos de gráficos. Gracias por esos enlaces @prule, ¡me ayudó a encontrar esa posibilidad! –

1

Aquí está the working example.

  • Tengo datos en JSON y archivo de plantilla .xlsm con macro. - no se necesita ningún gráfico, datos o nombre de rango en excel

  • Clona la hoja de plantilla cada vez que se necesita crear una hoja con gráfico, coloca un tipo de gráfico requerido en z1 y cambia el gráfico de líneas predeterminado que se insertó en el tipo de gráfico apropiado . Elimina el tipo de gráfico de z1 para evitar la ejecución múltiple.

Espero que ayude.

Cuestiones relacionadas